新附加的对象不响应来自页面加载的jQuery事件

时间:2012-12-06 15:26:49

标签: javascript jquery

我在这里使用Backbone,但我也遇到过非骨干网站的这个问题。

基本上,我的问题是我在一个javascript文件base.js中定义了许多“全局”jquery函数。然后,我加载新元素并使用Backbone,AJAX或您喜欢的任何异步调用将它们附加到页面。这很好用,除了新对象似乎没有链接到我在pageload上声明的jQuery事件。 (对不起这里的门外汉语 - 我经常用正确的措辞换新手)

例如,假设我在页面加载中加载的js文件中声明:

 $('.element').hover(function(){alert('hi world')});

但是后来我在pageload之后添加了一个新元素,然后这个悬停将不起作用。

任何人都可以解释:

  1. 为什么会这样?
  2. 我是否可以强制使用新的附加元素/侦听已声明的当前事件?
  3. 我怀疑(2)可能无法(我必须在追加后重写事件),但我很想知道是否有某种解决方案。

1 个答案:

答案 0 :(得分:5)

  

为什么会这样?

因为当执行事件绑定代码时,DOM中不存在的元素已经不会受到影响(它们怎么可能?它们还不存在!)“普通”事件绑定方法(例如{{ 1}}或.click())会将事件处理函数的副本附加到匹配集中的每个元素。

  

我可以强制使用新的附加元素来处理/侦听已经声明的当前事件吗?

您确实可以通过委托将事件处理程序放在DOM树的更高位置。由于大多数DOM事件从它们所源自的元素中冒出树,因此效果很好。使用jQuery,您可以使用.on()(jQuery 1.7+ - 旧版本使用.delegate())方法来执行此操作:

.change()

在代码运行时,DOM中必须存在调用$("#someCommonAncestor").on("someEvent", ".element", function () { // Do stuff }); 的元素。当事件冒泡到足以达到.on()可能的范围时,jQuery将检查目标元素是否与您传递给#someCommonAncestor的选择器匹配。如果是,它将执行事件处理程序。如果没有,事件将继续冒泡到文档的根目录而不会触发任何处理程序。