Я пытаюсь создать плагин, где передаю функции обработчика для определенных событий. В простом примере ниже у меня есть две кнопки. Когда я нажимаю кнопку 1, ее метка должна меняться на «Button A», и когда я нажимаю кнопку 2, ее метка должна быть изменена на «Button B».Закрытие JQuery в цикле
Однако, что происходит, когда я нажимаю кнопку 1, метка меняется на «Button 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/
Put ваше выражение функции внутри 'createHandlerFunction' (так, чтобы оно было возвращено), а не вокруг вызова, и оно будет работать. – Bergi
Немного не по теме: вы не должны использовать 'for..in' для итерации массивов. –