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'或不加選擇器上。 –