Javascript/JQuery回调混淆
我展示了一个模态,以供确认:Javascript/JQuery回调混淆,javascript,jquery,Javascript,Jquery,我展示了一个模态,以供确认: <div class="modal" tabindex="-1" role="dialog" id="modal"> <div class="modal-dialog" role="document"> <div class="modal-content">
<div class="modal" tabindex="-1" role="dialog" id="modal">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
... Body ...
<div class="modal-footer">
<button type="button" id="btnCancel" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" id="btnOk" class="btn btn-primary" data-dismiss="modal">Ok</button>
</div>
</div>
</div>
</div>
下面是我如何使用它。。。(例如,在任何视图中)
现在,问题是:如果我调用confirm,它将显示模态。但是如果我单击Cancel,然后再次调用confirm,这次我点击OK:函数(上面代码段中的第二个参数)被调用两次。如果我点击cancel 10次,则调用上述函数10次
知道为什么会这样吗
谢谢。每次您呼叫
确认
时,您都会向btnCancel
和btnOk
中的每一个添加一个事件处理程序
但是,只有在单击该按钮时,才能删除其中一个按钮上的效果处理程序
因此,如果您调用confirm
,然后单击btnCancel
,然后调用confirm
,您将在btnOK
上有两个事件处理程序:第一次调用confirm
时有一个,第二次调用时有一个
单击任一按钮时,您需要同时删除两个事件处理程序
…或者在加载文档时只添加事件处理程序,以后不要再碰它们。每次调用
confirm()
时都会分配事件处理程序。因此,第二次调用confirm时,您正在添加另一组处理程序(而不是替换旧的处理程序)。您应该从<代码>确认()/<代码>函数中删除事件处理程序,并只分配它们一次。考虑使用<代码>。code>.one()只有一次。@Scott/Hive7/Jeremy知道了。。谢谢大家..@JeremyThille这有点误导,因为您可以使用一个()添加多个侦听器,但每个侦听器只能调用一次。
var M = {
confirm: function(body, yes, no) {
$('#btnCancel').on('click', function() {
$('#btnCancel').off();
$('#confirm-modal').modal('hide');
if (no) {
return no();
}
});
$('#btnOk').on('click', function() {
$('#btnOk').off();
$('#modal').modal('hide');
if (yes) {
return yes();
}
});
}
}
M.confirm("Body", function(){
// Function Body
})