2011-04-14 66 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]);} 

嘗試。

乾杯