将事件绑定到多个元素而不循环(vanilla JS)

mon*_*ers 5 javascript

我试图达到相当于:

$('div').on('click', function() {
    // Do something
});
Run Code Online (Sandbox Code Playgroud)

但没有jQuery.我最初的想法是使用一个for循环迭代集合中的所有元素,但我的猜测是有一种更好的方法来实现这一点而不使用循环(一些本机方法?).

var elems = document.getElementsByTagName('div');

function someEvent() { // Generic function to test against
    alert('event fired');
}

for (var i=0, j = elems.length; i < j; i += 1) {
    elems[i].addEventListener("click", someEvent);
}
Run Code Online (Sandbox Code Playgroud)

没有包含库,有更优雅的方式吗?

She*_*hea 10

你想要的是事件授权.它的工作原理是将单个事件绑定到多个节点的父节点,并分析事件的目标节点.例如,您可以绑定onmouseupbody节点,并且当从div节点上释放鼠标触发它时,body事件对象将divtarget属性中包含该节点.您可以分析目标以确保它符合某些标准.

解释这个的更好方法是提供一个工作示例.

document.body.onmouseup = function (event) {
    var target = event.target || event.toElement;

    if (target.nodeName.toLowerCase() == "div") {
       alert(target.childNodes[0].nodeValue);
    };
};
Run Code Online (Sandbox Code Playgroud)

这个例子的主要关注点是target变量,以及验证我们target是a 的条件div.这种情况甚至可以是className你心中想要的东西.