2011-05-01 44 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')); 
}