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
})