首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeList上的addEventListener

NodeList上的addEventListener
EN

Stack Overflow用户
提问于 2012-09-11 11:15:52
回答 8查看 45.3K关注 0票数 36

NodeList是否支持addEventListener。如果不是,那么向NodeList的所有节点添加EventListener的最佳方式是什么。目前我正在使用如下所示的代码片段,有没有更好的方法来做到这一点。

代码语言:javascript
复制
var ar_coins = document.getElementsByClassName('coins');
for(var xx=0;xx < ar_coins.length;xx++)
{
        ar_coins.item(xx).addEventListener('dragstart',handleDragStart,false);
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-09-11 11:44:53

如果不遍历每个元素,就不可能做到这一点。当然,您可以编写一个函数来为您完成此操作。

代码语言:javascript
复制
function addEventListenerList(list, event, fn) {
    for (var i = 0, len = list.length; i < len; i++) {
        list[i].addEventListener(event, fn, false);
    }
}

var ar_coins = document.getElementsByClassName('coins');
addEventListenerList(ar_coins, 'dragstart', handleDragStart); 

或者更专业的版本:

代码语言:javascript
复制
function addEventListenerByClass(className, event, fn) {
    var list = document.getElementsByClassName(className);
    for (var i = 0, len = list.length; i < len; i++) {
        list[i].addEventListener(event, fn, false);
    }
}

addEventListenerByClass('coins', 'dragstart', handleDragStart); 

而且,尽管您没有问到jQuery,但这是jQuery特别擅长的事情:

代码语言:javascript
复制
$('.coins').on('dragstart', handleDragStart);
票数 46
EN

Stack Overflow用户

发布于 2015-11-03 13:55:23

我能想到的最好的结果是:

代码语言:javascript
复制
const $coins = document.querySelectorAll('.coins')
$coins.forEach($coin => $coin.addEventListener('dragstart', handleDragStart));

请注意,这使用了ES6特性,所以请确保首先转换它!

票数 20
EN

Stack Overflow用户

发布于 2013-01-31 20:53:41

实际上,有一种方法可以在没有循环的情况下做到这一点:

代码语言:javascript
复制
[].forEach.call(nodeList,function(e){e.addEventListener('click',callback,false)})

在我的一个单行助手库nanoQuery中就使用了这种方法。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12362256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档