我已经了解jQuery的事件委托(delegate)。
但是,如何在没有jQuery的情况下使用纯Java脚本执行相同的操作。
尽管我在主体或顶部元素(div)上附加了change
事件,但是当主体或顶部元素中的输入元素的值发生更改时,不会触发change
事件...
我怎样才能做到这一点?
最佳答案
您可以只在一个元素上监听事件(在本例中为elSelector
),然后仅在实际目标适合该元素中的selector
时执行事件。
function on(elSelector, eventName, selector, fn) {
var element = document.querySelector(elSelector);
element.addEventListener(eventName, function(event) {
var possibleTargets = element.querySelectorAll(selector);
var target = event.target;
for (var i = 0, l = possibleTargets.length; i < l; i++) {
var el = target;
var p = possibleTargets[i];
while(el && el !== element) {
if (el === p) {
return fn.call(p, event);
}
el = el.parentNode;
}
}
});
}
在下面的示例中,您可以看到它也适用于动态元素!
on("#inputs", "change", ".event", (target, evt) => console.log(target.target));
function on(elSelector, eventName, selector, fn) {
var element = document.querySelector(elSelector);
element.addEventListener(eventName, function(event) {
var possibleTargets = element.querySelectorAll(selector);
var target = event.target;
for (var i = 0, l = possibleTargets.length; i < l; i++) {
var el = target;
var p = possibleTargets[i];
while (el && el !== element) {
if (el === p) {
return fn.call(p, event);
}
el = el.parentNode;
}
}
});
}
/** random code for the button to add more inputs **/
let i = 7;
document.querySelector("#b").addEventListener("click", () => {
document.querySelector("#inputs").innerHTML += i + ` <input type="text" class="event"> <br>`;
i++;
});
<div id="inputs">
1 <input type="text" class="event"> <br>
2 <input type="text" class=""> <br>
3 <input type="text" class="event"> <br>
4 <input type="text" class=""> <br>
5 <input type="text" class="event"> <br>
6 <input type="text" class=""> <br>
</div>
<br><br>
<button id="b">Add another input</button>