2011-05-01 70 views
1

我有下面的代碼和javascript的關閉與匿名函數一起給我頭痛。jquery和javascript的關閉

for (var i = 0, len = sites.length ; i < len ; i++) 
{ 
    $("#thumb"+i).click(function() { $("#shader").show(); $("#thumbInfo"+i).show(); alert("#thumbInfo"+i); }); 
    $("#thumbInfo"+i+" .xbutton").click(function() { $("#shader").hide(); $("#thumbInfo"+i).hide(); }); 
} 

由於關閉,我總是5(sites數組有5個元素),所以所有的點擊處理程序引用相同的ID。

任何解決方法?

+0

如果您展開循環(用'更換五次i'硬編碼)它工作嗎?我有一種感覺,我不是問題。 – 2011-05-01 04:09:22

回答

5

你總是可以循環使用jQuery的each()

$.each(sites, function(i) { 
    $("#thumb"+i).click(function() { $("#shader").show(); $("#thumbInfo"+i).show(); alert("#thumbInfo"+i); }); 
    $("#thumbInfo"+i+" .xbutton").click(function() { $("#shader").hide(); $("#thumbInfo"+i).hide(); }); 
}); 
+1

噢,不錯:)不知道。 – 2011-05-01 04:07:06

0
var len = sites.length ; 
for (var i = 0; i < len ; i++) 
    { 
     $("#thumb"+i).click(function() { $("#shader").show(); $("#thumbInfo"+i).show(); alert("#thumbInfo"+i); }); 
     $("#thumbInfo"+i+" .xbutton").click(function() { $("#shader").hide(); $("#thumbInfo"+i).hide(); }); 
    } 

你可能已經指派5我;

+0

不,閉包允許訪問父對象的變量'i',它在調用'click()'事件時被設置爲'5'。 – alex 2011-05-01 04:04:55

3

使用你的迭代封閉:

for (var i = 0, len = sites.length ; i < len ; i++) 
{ 
    (function(i) { 
     $("#thumb"+i).click(function() { 
      $("#shader").show(); 
      $("#thumbInfo"+i).show(); 
      alert("#thumbInfo"+i); 
     }); 
     $("#thumbInfo"+i+" .xbutton").click(function() { 
      $("#shader").hide(); 
      $("#thumbInfo"+i).hide(); 
     }); 
    }(i)); 
} 
2

將一個函數由i外循環返回功能和參數。無論如何,JSLint會鼓勵你這樣做,有些人可能會發現它更易於啓動。

function make_fn1(i) { 
    return function() { $("#shader").show(); $("#thumbInfo"+i).show(); }; 
} 
function make_fn2(i) { 
    return function() { $("#shader").hide(); $("#thumbInfo"+i).hide(); }; 
} 
for (var i = 0; i < sites.length ; i++) 
{ 
    $("#thumb"+i).click(make_fn1(i)); 
    $("#thumbInfo"+i+" .xbutton").click(make_fn2(i)); 
} 

但是,這可以通過其他方式清理。對於初學者來說,只要你使用jQuery,$("#shader, #thumbInfo"+i).show();更簡潔。此外,在當前代碼的概念,這兩個函數隱藏或顯示相同的兩個元素不分解出來,因此可能會

function make_fn (i,showhide) { 
    return function() { $("#shader, #thumbInfo"+i)[showhide]() }; 
} 
for (var i = 0; i < sites.length ; i++) 
{ 
    $("#thumb"+i).click(make_fn(i,'show')); 
    $("#thumbInfo"+i+" .xbutton").click(make_fn(i,'hide')); 
}