Javascript JS onclick未正确启动
我有以下功能。问题在于,该函数没有像预期的那样等待用户单击图像,而是立即为图像数组中的每个元素启动imgReplace函数 我做错什么了吗? 我正在使用一个基于Jquery的单独Javascript例程,这一事实是否与此相关Javascript JS onclick未正确启动,javascript,onclick,Javascript,Onclick,我有以下功能。问题在于,该函数没有像预期的那样等待用户单击图像,而是立即为图像数组中的每个元素启动imgReplace函数 我做错什么了吗? 我正在使用一个基于Jquery的单独Javascript例程,这一事实是否与此相关 function setup () { var images = document.getElementById("mycarousel"); images = images.getElementsByTagName("img"); for (va
function setup () {
var images = document.getElementById("mycarousel");
images = images.getElementsByTagName("img");
for (var i = 0; i< images.length; i++) {
images[i].onclick = imgReplace (images[i]);
}
}
功能设置(){
var images=document.getElementById(“mycarousel”);
images=images.getElementsByTagName(“img”);
对于(var i=0;i
将调用imageReplace的结果分配给onclick处理程序。而是将对imageReplace的调用包装到它自己的函数中
images[i].click = function(){ imgReplace( images[i] ) }
但是,这样做将始终替换最后一个图像。您需要创建一个新变量来封装索引
for (var i = 0; i< images.length; i++) {
var imageIndex = i;
images[i].onclick = function(){ imgReplace (images[imageIndex]); }
}
for(var i=0;i
您在这里要做的是:
images[i].onclick = function() {imgReplace(images[i]);}
试试看
干杯哇,我刚刚在自己的一些代码中修复了这个令人尴尬的错误。其他人都弄错了:
images[i].onclick = function() {imgReplace(images[i]);};
不行。相反,它应该是:
images[i].onclick = (function(i) { return function() { imgReplace(images[i]); }; })(i);
Paul Alexander的答案是正确的,但是你不能通过引入另一个这样的局部变量来解决这个问题。JavaScript块(如“代码”> { } //Cux.Boad)在“Of”循环中不创建新的范围,这是与java或C++的显著(和不明显)差异。只有函数创建作用域(将一些新的ES5特性放在一边),这就是为什么上面引入了另一个函数。循环中的“i”变量作为参数传递给匿名函数。该函数返回实际的事件处理函数,但现在它引用的“i”将是外部函数作用域的不同参数。因此,每次循环迭代都将创建一个专门用于“i”的单个值的新范围。将不起作用,因为“for”块不会启动新范围。只有函数才能创建作用域,因此实际上只有一个“imageIndex”变量,就像只有一个“i”一样。替换方法超出了我的想象,但解决了我仍然存在的问题。Javascript闭包,请查找: