jQuery不会为动态创建的元素添加侦听器。它所做的是它有一个语法,可以为你设置事件委托。
您可以通过听一些容器元素上,并检查什么被点击,看看是否处理程序应运行这样做。
例如,这个监听的body
,虽然更多的本地容器是可取的。
document.body.addEventListener("click", function(event) {
if (event.target.matches("span")) {
deleteItem.call(this, event);
}
});
这是一个有限的实现,因为它只检查event.target
,看它是否选择匹配。为了更彻底,你会想从event.target
了通过其.parentNode
s到遍历,检查每一个,直到你到达this
元素。
这可以很容易抽象出来一个构建处理程序的辅助功能。
document.body.addEventListener("click", delegate("span", deleteItem));
function deleteItem(event) {
console.log("clicked on '%s'", this.textContent);
}
function delegate(selector, handler) {
return function(event) {
var targ = event.target;
do {
if (targ.matches(selector)) {
handler.call(targ, event);
}
} while ((targ = targ.parentNode) && targ != event.currentTarget);
}
}
span { color: red; }
<div>
<span>I'm a span!</span>
Not a span
<p>
<span>Another span!</span>
</p>
</div>
的'on'包装了逻辑直接附接和deleagte事件处理,这取决于如果作为参数传递给'on'或不加选择器上。 –