我在这里使用Backbone,但我也遇到过非骨干网站的这个问题。
基本上,我的问题是我在一个javascript文件base.js中定义了许多“全局”jquery函数。然后,我加载新元素并使用Backbone,AJAX或您喜欢的任何异步调用将它们附加到页面。这很好用,除了新对象似乎没有链接到我在pageload上声明的jQuery事件。 (对不起这里的门外汉语 - 我经常用正确的措辞换新手)
例如,假设我在页面加载中加载的js文件中声明:
$('.element').hover(function(){alert('hi world')});
但是后来我在pageload之后添加了一个新元素,然后这个悬停将不起作用。
任何人都可以解释:
我怀疑(2)可能无法(我必须在追加后重写事件),但我很想知道是否有某种解决方案。
答案 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
的选择器匹配。如果是,它将执行事件处理程序。如果没有,事件将继续冒泡到文档的根目录而不会触发任何处理程序。