window
、document
),并且我需要能够在页面生命周期内更新动态创建(或销毁)的节点的事件绑定。有三种方法可以解决这个问题:I) 在
window
上进行事件委托II) 直接在每个节点上进行事件绑定
III) 在共同祖先上进行事件委托(直到运行时才知道,当DOM发生变化时可能需要重新计算)
哪种方法最有效?
一些背景信息
我正在开发一组需要对用户事件(点击、滚动等)进行分析跟踪的页面,并希望能够在许多页面上轻松配置这些事件处理程序,而不需要编写处理每个实例的事件绑定的脚本。此外,由于我可能需要在将来跟踪新的事件,或者跟踪动态添加到/从页面中删除的元素上的事件,因此我需要能够考虑在页面生命周期内发生的DOM更改。
作为我目前正在考虑的一个示例,我想创建一个函数,该函数接受一个配置对象,允许程序员指定每个事件的默认处理程序,并允许他们覆盖特定元素的处理程序:
Analytics.init({
// default handlers for each event type
defaultHandlers: {
"click": function(e) { ... },
"focus": function(e) { ... }
},
// elements to listen to
targetElements: {
// it should work with non-DOM nodes like 'window' and 'document'
window: {
// events for which the default handlers should be called
useDefaultHandlers: ['click'],
// custom handler
"scroll": function(e) { ... }
},
// it should work with CSS selectors
"#someId": {
useDefaultHandlers: ['click', 'focus'],
"blur": function(e) { ... }
}
}
});
document
的大多数事件,那么你可以委托给它。但是,如果你只处理一小部分事件,特别是如果这些事件频繁触发(例如mousemove
、scroll
),最好委托给更近的祖先元素。如果有很多元素,我不会对每个元素进行绑定。 - Oriol