2

我使用创建一个元素Jquery并给它一个类.book

jQuery('<div/>', {
    name: "my name",
    class: 'book',
    text: 'Bookmark',
}).appendTo('body');

然后我想在单击该类时做一些事情,所以我自然而然地写了一个快速而简单的:

$('.book').click(function(){
    alert('I have been clicked');
});

这样可行

什么不起作用,如果我让它在点击时添加这些元素。所以以下不起作用:

var bms = 0;
$('button').click(function(){
    bms += 1;
    jQuery('<div/>', {
        name: bms,
        class: 'book',
        text: 'Bookmark ' + bms
    }).appendTo('body');
});
$('.book').click(function(){
    alert('I have been clicked');
});

为什么会发生这种情况,我该如何解决?

提琴手

另一件事:

此外,如果我的正文中已经有一个包含该类的 div .book,则 click 事件将适用于该类,但不适用于任何附加div的 s。这是另一个 jsfiddle 来表明

4

3 回答 3

7

你必须委托给新创建的元素,就像这样......

换这个就行了...

$('.book').click(function(){
  alert('I have been clicked');
});

有了这个....

$(document).on('click','.book', function(){
  alert('I have been clicked');
});
于 2013-07-24T20:03:08.863 回答
1

您的问题是您将事件附加到尚未准备好接收该事件的元素。您应该将事件附加到父元素,然后您可以过滤.book. 这样,添加可点击元素时无关紧要,它会起作用。这称为事件委托。您将处理事件的任务委托给另一个元素。

HTML:

<body>
    <button>Click here to add book.</button>
</body>

还有你的 JS:

$(document).on("click", ".book", function() {
    alert('it works!');
});

var bms = 0;
$('button').click(function(){
    bms += 1;
    jQuery('<div/>', {
        name: bms,
        class: 'book',
        text: 'Bookmark ' + bms
    }).appendTo('body');
});

此外,在执行此操作时,不要将其附加到树上太高的父级。您想将其附加到最近的可能父元素。我们不需要在类似的东西上设置点击事件,document因为最好具体说明哪些元素将获得此事件。将其附加到document将意味着任何具有 类的元素.book都可以点击并响应相同的代码。如果您想在不同的按钮中具有不同的功能,则不能,因为它们都响应附加到document.

于 2013-07-24T20:09:58.040 回答
1

这些是直接绑定,不适用于动态添加的元素,例如.book.

您可以使用.on()在动态添加的元素上绑定事件,例如:

$('body').on('click', '.book' ,function(){
    alert('I have been clicked');
});

其中 body 将是最近的静态元素。这些类型的绑定称为委托事件。

小提琴:http: //jsfiddle.net/3MpcG/2/

或者,您可以在创建元素时在元素上绑定直接事件。

.appendTo('body').click(function(){
    alert('I have been clicked');
});

小提琴:http: //jsfiddle.net/3MpcG/3/

两者都有优点和缺点,您可以在jQuery .on() 文档页面上阅读它们。

于 2013-07-24T20:14:01.697 回答