javascript - 将其作为参数传递给 addEventListener()

标签 javascript dom dom-events

我想将 change 事件添加到一组复选框,如何在我的事件函数中访问 this ,以便在我执行事件时可以访问值复选框。

这是我当前的代码:

var checkboxes = document.getElementsByClassName('cb');
Array.from(checkboxes).forEach(function(){
  this.addEventListener("change", cbChange(this), false);
});

function cbChange(ele){
  console.log(ele.value);
}
<input class="cb" type="checkbox" name="candidate" value="1"/>
<input class="cb" type="checkbox" name="candidate" value="2"/>
<input class="cb" type="checkbox" name="candidate" value="3"/>
<input class="cb" type="checkbox" name="candidate" value="4"/>

最佳答案

forEach 回调中,this 引用 DOM 元素。它不引用任何有用的值。

其次,您立即调用 cbChange 并将其返回值传递给 addEventListener,这是 undefined。但是 addEventListener 期望传递一个函数,所以您要么必须传递 cbChange,要么传递一个调用 cbChange 的函数.

最后,虽然您可以定义事件处理程序以接受元素作为第一个参数,但如果它接受事件对象,则要简单得多,因为这是默认 API。

综上所述,最简单的解决方案是:

var checkboxes = document.getElementsByClassName('cb');
Array.from(checkboxes).forEach(function(element){
//                                      ^^^^^^^
  element.addEventListener("change", cbChange, false);
//^^^^^^^  
});

function cbChange(){
  console.log(this.value);
//            ^^^^
}

因为在事件处理程序中,this 指的是处理程序绑定(bind)到的元素,在 cbChange 中使用 this 就可以了。


这里有一些替代方案:

// Use the event object
var checkboxes = document.getElementsByClassName('cb');
Array.from(checkboxes).forEach(function(element){
  element.addEventListener("change", cbChange, false);
});

function cbChange(event){
  console.log(event.target.value);
}


// Using a wrapper that calls `cbChange`
var checkboxes = document.getElementsByClassName('cb');
Array.from(checkboxes).forEach(function(element){
  element.addEventListener("change", function() { cbChange(this); }, false);
});

function cbChange(ele){
  console.log(ele.value);
}

关于javascript - 将其作为参数传递给 addEventListener(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44988614/

相关文章:

javascript - 在 Javascript 的匿名函数回调中修改对象属性的正确方法

JavaScript 挑战表单元素数组验证

javascript - 如何制作顺序步进 slider ?

javascript - 如何解析迄今为止的 localStorage Item?

javascript - 悬停可拖动的 div 时更改背景

javascript - 数据 map - 如何改变海洋的颜色

javascript - 在for循环中创建DIV?(JS)

java - 从 URL 检索 XML,不写入前几行

javascript - 跨域访问元素

javascript - 添加事件监听器 Javascript 的问题