2012-02-27 61 views
0

我想爲從數據庫動態填充的縮略圖設置onclick事件。我需要設置函數來處理參數,這是縮略圖所代表的大圖的ID。我現在的代碼將所有縮略圖設置爲指向#18。如果您在for循環看,它應該在17你可以附加一個處理函數的參數到循環中的一些元素的onclick事件嗎?

for (var i = 0; i < 18; i++) { 
    document.getElementById('tat' + i).onclick = function() { display(i); }; 
} 

死了(我的縮略圖<img />一切都具有id="tat0"id="tat1"id="tat2"id="tat3"等) (display()負荷較大的PIC的縮略圖代表到一個單獨的元素)

每個縮略圖獲取此onclick函數,所以我知道for循環通過其ID正確訪問每個(爲每個我逐步通過),爲什麼所有的display(i)被分配到18?你能分配一個onclick函數來處理參數嗎?

+0

的可能重複(http://stackoverflow.com/questions/1451009/javascript-infamous-loop-problem) – 2012-02-27 12:55:29

+0

問題的底線[臭名昭著的Javascript環路問題?]:每個事件處理程序引用相同'i'。循環結束後,'i'的值爲'18'。解決方案是生成不共享相同變量的事件處理程序。這與'getElementById'和'onclick'都沒有關係。 – 2012-02-27 13:00:16

+0

你是對的,我不得不拉回來以不同的方式: function initOnClick(){ \t var images = document.getElementById(「thumbs」)。getElementsByTagName(「img」); \t \t 爲(VAR t = 0時;噸 BillyNair 2012-04-14 18:59:10

回答

1

您需要一個閉包函數來生成您的處理程序。

function genHandler(param) { 
    return function() { 
    // use all params in here 
    display(param); 
    } 
} 

,然後指定你的事件同樣

for (var i = 0; i < 18; i++) { 
    document.getElementById('tat' + i).onclick = genHandler(i); 
} 
+0

「你需要一個閉合功能來生成處理程序」。 OPs事件處理程序也是一個閉包。在你的代碼中,'genHandler'實際上不是閉包。 – 2012-02-27 12:57:04

0

它也可能工作,如果你只需要添加的「i」作爲參數傳遞給你的函數。

+0

哪個功能?你的意思是'function(i){display(i); };'?這是行不通的。傳遞給事件處理程序的第一個參數是事件對象(如果有)(IE)。 – 2012-02-27 12:57:20

+0

你是對的...... hack:'function(){display(this.id.substr(3)); };'可以使用,如果id是類型'tat0',就像你的。 – torbenl 2012-02-27 13:36:33

0

在一個函數中包裝你的onclick處理程序將創建一個閉包,它使當前的作用域與它關聯。

for (var i = 0; i < 18; i++) { 
    document.getElementById('tat' + i).onclick = (function(a) { 
     return (function() { 
      display(a); 
     }); 
    })(i); 
}​ 
相關問題