gpt4 book ai didi

javascript - 循环中的 Jquery 闭包

转载 作者:行者123 更新时间:2023-11-30 12:29:29 25 4
gpt4 key购买 nike

我正在尝试创建一个插件,用于传递特定事件的处理函数。在下面的简单示例中,我有两个按钮。当我按下按钮 1 时,其标签应更改为“按钮 A”,而当我按下按钮 2 时,其标签应更改为“按钮 B”。

但是,当我按下按钮 1 时,标签变为“按钮 B”。我知道这与循环中的处理函数闭包有关,但我不知道如何修复它。

<body>
<button class="btn1">Button 1</button>
<button class="btn2">Button 2</button>
</body>

这是我的 jquery:

$(function() {

$("body").myplugin( {
helperFunctions : {
funcA : function( obj ) {
$(obj).text( "Button A" );
},

funcB : function( obj ) {
$(obj).text( "Button B" );
}
},

handlers : [
{
on : "click",
selector : ".btn1",
handlerFunc : function( funcs, obj ){
funcs.funcA( obj );
}

},

{
on : "click",
selector : ".btn2",
handlerFunc : function( funcs, obj ){
funcs.funcB( obj );
}

}
]
});

});


(function ($) {
$.fn.extend({
myplugin: function ( settings ) {
var $this = $(this);

function createHandlerFunction( func, obj ){
return func( settings.helperFunctions, obj ) ;
}

for( var handlerIdx in settings.handlers ){
var handler = settings.handlers[ handlerIdx ];
$this.on(
handler.on,
handler.selector,
function() {
return createHandlerFunction( handler.handlerFunc, this ) } );
}
}
});
})(jQuery);

如果示例有点长,请见谅。这是 http://jsfiddle.net/30nL07db/

最佳答案

所以你的代码中的问题是这样的:

for( var handlerIdx in settings.handlers ){
var handler = settings.handlers[ handlerIdx ];
...

您在事件委托(delegate)中使用了 handler 变量,它绑定(bind)到外部变量 handlerIdx,因此当退出 for 循环时,handlerIdx 将是最后一个 ID...

这是一个有 3 个 ID 的反例:see fiddle

查看关于闭包的其他问题:here

关于闭包的教程:here

所以让我们创建一个函数来创建事件委托(delegate),在循环外部,在循环内部只传递该函数,如下所示:

function createEvent(id) {
$this.on(
settings.handlers[id].on,
settings.handlers[id].selector,
function() {
settings.handlers[id].handlerFunc( settings.helperFunctions, this)
}
);
}

for( var handlerIdx in settings.handlers ){
var handler = settings.handlers[ handlerIdx ];
var s = handler.selector;
createEvent(handlerIdx);
}

See fiddle with this answer, working as you expect

关于javascript - 循环中的 Jquery 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28193861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com