Onclick函数只适用于for each循环的第一次迭代是因为在每次迭代中,for each循环会为每个元素创建一个新的作用域。在每个作用域中,都会创建一个新的onclick函数实例,而不是共享同一个函数实例。
这意味着在每次迭代中,都会创建一个新的onclick函数,并且只有第一次迭代中的onclick函数会被绑定到相应的元素上。随后的迭代中,新创建的onclick函数将会覆盖之前的onclick函数,导致只有第一次迭代中的onclick函数能够正常工作。
为了解决这个问题,可以使用闭包来保留每次迭代中的onclick函数实例。通过在for each循环中创建一个立即执行的函数表达式,并将当前元素作为参数传递给该函数,可以在每次迭代中创建一个新的作用域,并将当前元素的引用保存在闭包中。这样,每个onclick函数实例都会有自己独立的作用域和元素引用,就可以正确地绑定到相应的元素上。
以下是一个示例代码:
var elements = document.getElementsByClassName('example');
Array.prototype.forEach.call(elements, function(element) {
(function(el) {
el.onclick = function() {
// 在这里编写onclick函数的逻辑
};
})(element);
});
在这个示例中,我们使用立即执行的函数表达式创建了一个闭包,并将当前元素作为参数传递给该函数。在闭包中,我们将当前元素的引用保存在变量el中,并将onclick函数绑定到el上。这样,每个元素都有自己独立的onclick函数实例,可以正确地处理点击事件。
推荐的腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云