2011-04-14 69 views
1

我有以下功能。问题在于,该函数并不等待用户按预期单击图像,而是立即为图像数组中的每个元素启动imgReplace函数。JS onclick没有正确触发

我做错了什么? 难道事实上我正在使用基于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]); 
    } 

} 
+0

Javascript关闭,查看:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures – dchayka 2014-02-28 18:24:21

回答

4

哇我只是在我自己的一些代码中修复了这个令人尴尬的错误。每个人都得到了错误:

images[i].onclick = function() {imgReplace(images[i]);}; 

将无法​​正常工作。相反,它应该是:

images[i].onclick = (function(i) { return function() { imgReplace(images[i]); }; })(i); 

保罗亚历山大的回答是正确的轨道上,但你不能引进这样的另一个局部变量解决这个问题。 JavaScript块(例如“for”循环中的{}块)不会创建新的范围,这与Java或C++有很大的区别(并且不明显)。只有函数创建范围(留出一些新的ES5功能),所以这就是为什么上面引入另一个函数的原因。循环中的“i”变量作为参数传递给匿名函数。 函数返回实际事件处理函数,但现在引用的“i”将是外部函数作用域的独特参数。因此,每个循环迭代都将创建一个专用于“i”的单个值的新范围。

+0

更换了我的头,但修复了我仍然有问题。 – YsoL8 2011-04-14 18:15:38

-1

您将调用的结果分配给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]); } 
} 
+1

不会工作,因为“for”块不会启动一个新的范围。只有函数创建范围,因此实际上只有一个“imageIndex”变量,就像只有一个“我”一样。 – Pointy 2011-04-14 18:11:41

-1

你想在这里做的是:

images[i].onclick = function() {imgReplace(images[i]);} 

尝试。

干杯