Javascript jQuery回调累积

Javascript jQuery回调累积,javascript,jquery,Javascript,Jquery,我正在构建一个名为magicForm的简单jQuery插件(这有多可笑?)。现在面对一个我认为我没有正确理解的问题 我的插件应该应用在一个容器元素上,当用户填充它们时,它会一个接一个地显示每个输入。这不是我问题的确切目的。 每次初始化容器时,我都会声明一个事件单击回调。让我举个例子 (函数($){ var方法={ 初始化:函数(选项){ 返回此值。每个(函数(){ var形式,输入; 变量设置={ 调试:false }; 设置=$.extend(设置、选项); 表格=$(本); $('a.sub

我正在构建一个名为magicForm的简单jQuery插件(这有多可笑?)。现在面对一个我认为我没有正确理解的问题

我的插件应该应用在一个容器元素上,当用户填充它们时,它会一个接一个地显示每个输入。这不是我问题的确切目的。 每次初始化容器时,我都会声明一个事件单击回调。让我举个例子

(函数($){
var方法={
初始化:函数(选项){
返回此值。每个(函数(){
var形式,输入;
变量设置={
调试:false
};
设置=$.extend(设置、选项);
表格=$(本);
$('a.submit',form).on('click',函数(事件){
如果(设置。提交回调){
settings.submitCallback.call(表单、输入);
}
返回false;
});
});
},
重置:函数(){
}
}
$.fn.magicForm=函数(方法){
if(方法[方法]){
返回方法[method].apply(this,Array.prototype.slice.call(arguments,1));
}else if(typeof方法=='object'| |!方法){
return methods.init.apply(这是参数);
}否则{
$.error('Method'+Method+'不存在');
}
};
})($);
我关注的是这段代码的一个特定部分:

$('a.submit',表单).on('click',函数(事件){
如果(设置。提交回调){
settings.submitCallback.call(表单、输入);
}
返回false;
});
因为每次调用
init
方法时,都会注册糟糕的回调

当我在一个嵌套在twitter引导“选项卡”中的元素上调用我的插件时,我痛苦地经历了这一点,该元素本身嵌套在引导模式中: 每次触发引导模式的“显示”事件时,我都在调用
init

这就是我在
init
方法中修复它的方法:

//防止回调累积
if(!$(this).data('form_initialized')){
$('a.submit',form).on('click',函数(事件){
如果(设置。提交回调){
settings.submitCallback.call(表单、输入);
}
返回false;
});
$(this).data('form_initialized',true);
}
我对此还远没有把握


谢谢你的时间

您可以首先明确删除单击处理程序:

$('a.submit', form).off('click').on('click', function(event){ ... })
但是,我建议您使用事件名称空间来防止删除所有单击处理程序(即使是那些可能由非您自己的代码设置的处理程序):

$('a.submit', form).off('click.magicForm').on('click.magicForm', function(event){ ... })

许多jquery插件使用
数据
来知道它们的插件是否已初始化。大多数情况下,他们使用自己插件的名称作为数据的一部分(或全部)。例如:

$(this).data('magicForm')

所以你用它来发信号的方法是不错的

但是,您还有两个其他选项:

1) 拉出事件处理程序,使其成为单个实例。在您的方法之上,执行
var fnOnSubmit=function(){…}
,然后您可以通过调用
$('a.submit',form.)来确保正确绑定。在按照您已经执行的方式重新绑定之前,先解除绑定('click',fnOnSubmit)

2) 另一个选项是使用事件名称空间

$('a.submit',form.).unbind('click.magicForm')
然后使用
.on('click.magicForm')
重新绑定该名称空间方法确保在解除绑定时,仅在名称空间magicForm的上下文中解除绑定,从而保留所有其他单击事件(例如,来自其他插件的事件)


我希望这能有所帮助。

什么是“计算”?我猜你的意思是“累积”?是的,我道歉,我修好了。不要道歉,我是个聪明人。我应该向你道歉!我想避免不绑定的方式,但名称空间的方式似乎是正确的。