为什么点击没有身体不起作用

时间:2013-09-10 00:03:41

标签: jquery jquery-plugins

我在页面上有多个myclass类,并且我使用ajax

添加了更多的类

如果我这样做

$('.myclass').click(function(){
          alert(1);
});

它适用于所有非ajax附加请求,但不适用于由ajax附加的类。 对于那些工作

$(body).on('click','myclass',function(){
alert(1);
});

我的问题,为什么会这样?

3 个答案:

答案 0 :(得分:5)

简要说明可以是

当您使用普通事件注册模型时,它会将处理程序直接注册到目标,这些处理程序在处理程序注册执行时存在于dom中。因此,动态添加的元素将不会获得这些处理程序。

对此的解决方案是使用事件委托,在此模型中,处理程序注册到祖先元素,当页面加载了选择器以过滤掉源元素时,该元素将出现。这利用了事件传播 - 元素中发生的事件传播到所有祖先元素(像焦点事件这样的例外)。因此,元素中发生的事件会传播到其中一个元素中的祖先元素,然后处理器被注册,然后事件源元素(event.target)及其祖先与作为第二个参数传递的选择器匹配,如果满足则处理程序已执行。 http://api.jquery.com/on/#direct-and-delegated-events

答案 1 :(得分:2)

第一个方法遍历执行处理程序时出现的元素,因此当时找到的任何东西都被绑定。

$('.myclass').click(function(){
          alert(1);
});

这允许的是在此点之后创建的元素被单独处理。

使用事件委派(您列出的第二种方法),您可以使用所需的选择器管理DOM中存在的所有元素。

$(body).on('click','myclass',function(){
    alert(1);
});

如果您希望在页面中添加动态元素,则使用事件委派的解决方案将允许您处理所有元素,无论它们何时被创建。

答案 2 :(得分:-3)

试试这段代码:

$('.myclass').on("click", function(){
      alert(1);
});

Live是委托事件的元素,即使这些元素仍然不存在于dom