Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS onclick未正确启动_Javascript_Onclick - Fatal编程技术网

Javascript JS onclick未正确启动

Javascript JS onclick未正确启动,javascript,onclick,Javascript,Onclick,我有以下功能。问题在于,该函数没有像预期的那样等待用户单击图像,而是立即为图像数组中的每个元素启动imgReplace函数 我做错什么了吗? 我正在使用一个基于Jquery的单独Javascript例程,这一事实是否与此相关 function setup () { var images = document.getElementById("mycarousel"); images = images.getElementsByTagName("img"); for (va

我有以下功能。问题在于,该函数没有像预期的那样等待用户单击图像,而是立即为图像数组中的每个元素启动imgReplace函数

我做错什么了吗? 我正在使用一个基于Jquery的单独Javascript例程,这一事实是否与此相关

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闭包,请查找: