javascript - 像javascript中的对象一样在数组上应用forEach方法

标签 javascript arrays foreach nodelist

这里我有四个输入按钮,我想为每个输入按钮添加事件处理程序。如果我使用 for 循环,我必须处理闭包。实际上,我想了解如何管理像对象这样的数组的 forEach 方法。这是我能管理的最接近的解决方案。因为如果我们想使用数组方法,我们必须遇到与闭包相关的问题。我不得不使用 object.keys 来获取索引并在它们上应用 forEach。虽然听起来很奇怪,但我不太了解对这个解决方案感到满意。它可以更简单吗?我如何直接在存储在 Buttons 变量中的 nodeList 上管理 forEach

function change(){
    var buttons=document.getElementsByTagName('input');
    var keys=Object.keys(buttons);

    keys.forEach(function(el,indx,arr){
        if(el != 'length'){
            this[el].addEventListener('click', function(e){ 
                alert(e.target.value);
            });
        }
    }, buttons);
}

change();
<input type='button' value='button1'> 
<input type='button' value='button2'> 
<input type='button' value='button3'> 
<input type='button' value='button4'> 

最佳答案

document.getElementsByTagName 返回一个“宿主对象”。这些对象在浏览器之间的行为可能不同。

buttons 是一个 NodeList ,不是数组。 Object.keys 在这里可能无法按预期工作,因为它可能具有 更多 属性,而不仅仅是索引和 length

NodeList ( https://developer.mozilla.org/en-US/docs/Web/API/NodeList) 的文档有一些将其转换为数组的示例,以及如何将其与 .forEach 一起使用。

我通常使用的方法没有列在文档页面上。我通常使用:

var arr = Array.prototype.slice.call(buttons);

查看此问题以获取更多信息:Fastest way to convert JavaScript NodeList to Array?

然后你可以这样做:

arr.forEach(function(el){
    el.addEventListener('click', function(e){ 
        alert(e.target.value);
    });
});

这是一个演示:

var buttons = document.getElementsByTagName('input');
var arr = Array.prototype.slice.call(buttons);
arr.forEach(function(el) {
  el.addEventListener('click', function(e) {
    alert(e.target.value);
  });
});
<input type='button' value='button1'>
<input type='button' value='button2'>
<input type='button' value='button3'>
<input type='button' value='button4'>

关于javascript - 像javascript中的对象一样在数组上应用forEach方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27947252/

相关文章:

javascript - 这是一个很好的字符串 sanitizer 吗?

c++ - 在栈尾分配的递归函数

python - 如何将数据集拆分/分区为训练和测试数据集,例如交叉验证?

c# - 通过 Foreach 什么时候可以修改?

javascript - 使用 for 循环生成 Html 表

javascript - setTimeout刷新和毫秒参数不起作用

javascript - Node JS - 在不知道键的情况下通过键合并对象

php - php 中的多个循环到 marge 目录和数据库

c++ - 迭代 vector 和调用函数

javascript - 如何验证服务器端的浏览器是否没有窗口引用?