导致此代码无法正常工作的原因是:该方法的问题是您没有提供函数作为第二个参数。您正在调用一个函数-该函数使事物变蓝。它没有返回使事情变蓝的函数。因此,您立即将其变为蓝色,并且单击发生时,没有什么可调用的,因为调用的函数没有返回任何值。
但是第一句话之后我迷路了。有人会愚蠢的吗?也许对代码进行直观的说明会有所帮助!
代码:https://jsfiddle.net/2yfj89af/1/
var submitSOBox = document.getElementsByClassName("submitSOBox");
for (i = 0; i < submitSOBox.length; i++) {
submitSOBox[i].addEventListener('click', SOBoxColor(i));
}
function SOBoxColor(i) {
submitSOBox[i].style.backgroundColor = "blue";
}
最佳答案
原因说明:您有这行:
submitSOBox[i].addEventListener('click', SOBoxColor(i));
这将调用
addEventListener
,该函数期望将函数作为最后一个参数。您提供的SOBoxColor(i)
不是函数,而是函数返回的值-调用它。要传递函数,您需要传递类似SOBoxColor
的内容,因此无需调用它。这是必需的,因为您的浏览器需要知道单击事件发生时要调用的内容。现在,仅传递
SOBoxColor
并不会满足您的要求。是的,这将使单击发生时调用SOBoxColor
,但是您不会将i
值传递给它。为此,您需要函数的修改版本,该版本以某种方式将
i
值预先填充为参数。幸运的是,有一种方法可以使用bind
方法创建此类修改后的函数,该方法返回相同的函数,但绑定了一些东西:submitSOBox[i].addEventListener('click', SOBoxColor.bind(submitSOBox[i], i));
bind
的第一个参数确定调用this
时特殊的SOBoxColor
对象将代表什么,第二个参数是i
将是什么。现在,这将起作用。
但是,如果您在
this
函数中使用SOBoxColor
关键字,则可以做得更好,因为那样的话,您甚至不需要i
参数:function SOBoxColor() {
this.style.backgroundColor = "blue";
}
...,并且您的绑定也可以不使用
i
参数:submitSOBox[i].addEventListener('click', SOBoxColor.bind(submitSOBox[i]));
仍然可以更简洁地完成操作,因为单击发生时,浏览器已经为我们提供了很好的服务:它将
this
关键字设置为添加了事件处理程序的元素,因此最终并没有甚至有必要将submitSOBox[i]
明确绑定到它。这也将起作用: submitSOBox[i].addEventListener('click', SOBoxColor);
...只要您将
SOBoxColor
功能更改为可以与this
一起使用。