2012-12-29 227 views
0

我已經知道環路感謝封這樣如何:我現在想的Javascript關閉:循環內循環

for (var i = first; i <= last; i++) { 
    document.getElementById(more + i).onmouseover = (function(arg1) { 
     return function() { 
      document.getElementById(arg1).style.display = "block"; 
     } 
    })(i); 
} 

但要做到一看內循環。 我有必須動態附加到其他元素的DOM的元素。元素是類型:'1text1', '1text2', '1text3',...'2text1', '2text2', '2text3', '3text4'... 我已經試過這樣的事情:

var text; 
var ktext; 
for (var k = 1; k <= last_number; k++) { 
    for (var i = first; i <= last; i++) { 
     ktext = k + text; 
     document.getElementById(ktext + i).onmouseover = (function(arg1, arg2) { 
      return function() { 
       document.getElementById(arg1 + arg2).style.display = "block"; 
      } 
     })(ktext, i); 
    } 
} 

但環部分喪失。如果我只在var i循環的開頭處輸入alert(ktext + i),我會看到:1text1, 1text2, 1text3, 1text4,然後是2text1(如預期的那樣),但不是2text2, 2text3...,好像var k循環的第二遍停止得太早。

+1

你在循環中綁定事件處理程序嗎?你考慮過事件代表團嗎? –

+0

你在初始化之前使用變量'text'。 – 0x499602D2

回答

2

你使用閉包是不必要的:

for(k=1; k<=last_number; k++) { 
    for(i=first; i<=last; i++) { 
    document.getElementById(k+text+i).onmouseover = function() { 
     this.style.display = "block"; 
    } 
    } 
} 

無論如何,你的循環可能是早期停止,如果一個元素不存在於頁面上。在嘗試分配元素之前,您應該檢查元素的存在。

+0

我的不好,我想簡化來發布我的代碼在這裏,我剪了一些有用的部分:像:'document.getElementById(arg1 + arg2 + more).style.display =「block」'這兩個元素是不同的 – ThePhi

+0

那麼,在任何情況下,您都可以使用'this.id'來獲取元素的ID,因此您可以使用它來代替創建多個閉包。你甚至可以委託事件,以便完全刪除循環,只需要:'document.body.onclick = function(e){e = e || window.event; var t = e.srcElement || e.target; var id = t.id;/*現在做基於ID的東西* /};' –

+0

謝謝!那正是我所期待的。我去做! – ThePhi