在循环中绑定事件处理程序所需的闭包
Closure needed for binding event handlers within a loop?
我试图在一个循环中绑定事件处理程序,如:
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);
});
}
只保留最后一个边界(值' 4 ')。
我正在尝试整合当前有效的代码:
$('#one').click(function() {
loadTabs(0, tabs);
});
$('#two').click(function() {
loadTabs(1, tabs);
});
$('#three').click(function() {
loadTabs(2, tabs);
});
$('#four').click(function() {
loadTabs(3, tabs);
});
我想我可能需要一个结束由于这篇文章。
你在其他帖子中读到的是对的。您需要创建一个闭包来将参数绑定到每个onclick处理程序:
$('#' + tabs[i]).bind(
'click',
(function(id) {
return function()
{
loadTabs(id, tabs);
};
})(id)
);
你可能还想研究一下curry。在本例中,您可以创建一个小的辅助函数,它将第一个参数绑定到传递的函数并返回新函数。
function curry(func, arg1)
{
return function()
{
func(arg);
};
}
然后像这样放在一起:
$('#' + tabs[i]).bind(
'click',
curry(function(id) { loadTabs(id); }, id)
);
注意,我的curry函数不符合curry的定义,因为它忽略了任何其他参数。
如果你已经在使用jQuery,你可以使用jQuery。每个人都有这个任务。因此,您不需要像您正确地假设的那样,自己使用closures
。
var tabs = ['one', 'two', 'three', 'four'];
$.each(tabs, function(idx, tab) {
$("#" + tab).on("click", function() {
alert(idx);
//loadTabs(idx, tabs);
})
});
jsfiddle
相关文章:
- 在underscorejs模板中使用闭包
- setTimeout可以与闭包内的函数一起使用吗
- 附加到原型属性的Do函数没有闭包
- 使用闭包共享构造函数参数
- 使用Google闭包编译器包含一个Ecmascript 6类
- 从js引擎的角度来看闭包和构造函数是如何工作的
- 将参数从闭包传递给事件处理程序
- 闭包、循环和事件处理程序
- 为什么使用 JavaScript 闭包实现回调和事件处理程序附件
- Javascript闭包和前后函数处理程序
- 循环中的闭包:在循环中声明的变量在绑定事件侦听器时未正确预设到处理程序函数中
- 闭包(JS)迭代程序
- 全局ajax错误处理程序和闭包
- 在循环中绑定事件处理程序所需的闭包
- 对象中的闭包或处理程序
- 是否有一个实用程序来深度比较对象在谷歌闭包库
- jQuery事件处理程序闭包与上下文
- 闭包内部的Javascript事件处理程序“this”绑定不起作用
- 如何程序设置Javascript getter/setter ?(或者实际上是闭包作用域)
- 用Javascript闭包完成处理程序查找没有显示结果