0

HTML

<div class="pop-circle Cats"></div>

CSS

.pop-circle { width:8px;height:8px;border-radius:4px;background-color:#50377A; }

JS

$(".pop-circle").attr("title", "blah");

按预期工作。但是,稍后(在用户交互之后)如果我 .append(mydiv) 多个具有相同“pop-circle”类的 div(Cats、Dogs 等),则不会将 title 属性添加到它们。这是有道理的,没有新的事件。那你会怎么做?

我的第一个想法是这样做:

$("div.pop-circle").hover( function() {
    $(".Cats").attr("title", "cats");
    $(".Dats").attr("title", "dogs");
    // ...
});

我认为即使在页面加载后附加的 div 上也应该触发悬停。但是,这有一个奇怪的效果,没有添加属性,至少在我悬停 div 的前几次没有添加,或者根本没有添加。(对不起,我不想展示 div 附加的实时示例。)

我想知道是否有更明智的方法来做到这一点。

4

5 回答 5

2

侦听器不附加到新的动态创建的元素。附加代码后,您需要重新注册任何事件侦听器。将它们收集在一个函数中并再次调用它们通常很有帮助。

function ActivateListeners() {
    $('div.pop-circle').hover(function() {
       //do something 
    });
}
ActivateListeners();

$('something').click(function() {
    $('body').append("<div class='pop-circle'>Stuff</div>");
    ActivateListeners();
});

编辑:虽然这可行,但热情编码器的答案(使用 .on())是处理此问题的正确方法。

于 2013-06-18T16:59:40.397 回答
2

对于这样的情况,我会说编写一个自动添加title到元素的函数是最好的方法。

或者,如果您想完成这项hover工作,则必须将其绑定到文档或静态父级,然后从那里将此事件委托给 div 元素。

$(document).on("mouseover", ".pop-circle", function () { //or instead of document use IMMEDIATE STATIC parent
    var title = $(this).attr("class").split(" ")[1]; //taking out the extra thing out of the class attribute - the animals
    $(this).attr("title", title);
});

您的 HTML 现在看起来像这样:

<div class="pop-circle Cats"></div>
<br/>
<div class="pop-circle Dogs"></div>
<br/>
<div class="pop-circle Rats"></div>
<br/>
<div class="pop-circle Monkeys"></div>
<br/>
<button>Add more</button>
<input type="text" />

我添加额外的代码.pop-circle

$("button").on("click", function () {
    var animal = $("input:text").val();
    $("input:text").val("");
    $(this).before("<div class= 'pop-circle " + animal + "' ></div>");
});

没有按照您的编码方式工作的原因hover是,当您将 绑定hover到 时.pop-circle,它只绑定到现有元素而不绑定到未来元素。为了支持未来的元素,您必须将此事件绑定到其父级,例如document"body"

这是一个演示:http: //jsfiddle.net/hungerpain/zxfL2/1/

于 2013-06-18T17:03:29.200 回答
2

感谢@passionateCoder “将此事件绑定到其父级”

这是我最终使用的:

$("#content").on("click mouseover", ".pop-circle", function() {

    $(".Dogs").attr("title", "Dog Categories");
    $(".Cats").attr("title", "Cat Categories");
    // ...

});
于 2013-06-18T17:20:45.120 回答
0

据我了解,jQuery 中的 attr() 方法仅获取在加载时定义的属性,并且不会包含脚本更改的值。jQuery 1.6 版本引入了 prop() 方法,该方法反映了页面加载后对 DOM 所做的更改。用法相同。

编辑:在重新阅读您的问题后,我可能会离开这里。我很抱歉。也许 prop() 有一天会派上用场!:)

于 2013-06-18T17:04:03.047 回答
0

您可以将数据属性添加到 div,然后使用它来创建标题。

http://jsfiddle.net/pjdicke/53Yf9/1/

$("#output").on('mouseenter', '.pop-circle', function () {
    var type = $(this).data('type');
    $(this).attr('title', type);
    alert( $(this).attr('title') );
});

$('button').on('click', function () {
    var newItem = $('<div class="pop-circle" data-type="Dats"></div>');
    $(newItem).appendTo('#output');
});
于 2013-06-18T17:27:40.783 回答