我正在尝试在循环中绑定(bind)事件处理程序,例如:
var tabs = ['one', 'two', 'three', 'four']
for(var i = 0; i < tabs.length; i++) {
alert(tabs[i]);
var id = i;
$('#' + tabs[i]).bind('click', function() {
loadTabs(id, tabs);
});
}
它只保留最后一个边界(值“四”)。
我正在尝试整合目前有效的这段代码:
$('#one').click(function() {
loadTabs(0, tabs);
});
$('#two').click(function() {
loadTabs(1, tabs);
});
$('#three').click(function() {
loadTabs(2, tabs);
});
$('#four').click(function() {
loadTabs(3, tabs);
});
由于 this post,我想我可能需要关闭.
最佳答案
您在 other post 中读到的内容是正确的. 您需要创建一个闭包以将参数绑定(bind)到每个 onclick 处理程序:
$('#' + tabs[i]).bind(
'click',
(function(id) {
return function()
{
loadTabs(id, tabs);
};
})(id)
);
您可能还想查看 currying . 在此示例中,您可以创建一个小的辅助函数,它将第一个参数绑定(bind)到传递的函数并返回新函数。
function curry(func, arg1)
{
return function()
{
func(arg);
};
}
然后像这样把它们放在一起:
$('#' + tabs[i]).bind(
'click',
curry(function(id) { loadTabs(id); }, id)
);
请注意,我的 curry 函数不符合 currying 的定义,因为它忽略了任何其他参数。但它应该适用于您的情况。
关于javascript - 在循环中绑定(bind)事件处理程序需要关闭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624057/