【发布时间】:2015-01-28 13:47:30
【问题描述】:
我正在尝试创建一个插件,在其中传递特定事件的处理函数。在下面的简单示例中,我有两个按钮。当我按下按钮 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/
【问题讨论】:
-
将您的函数表达式放在
createHandlerFunction中(以便返回),而不是在调用周围,它会起作用。 -
有点题外话:你不应该使用
for..in来迭代数组。
标签: javascript jquery closures