为什么这个回调处理程序被调用两次
Why is this callback handler being called twice?
我有以下JavaScript代码。当用户单击页面上的按钮时,它会从数据属性中读取"name"和"stepId",然后打开 Twitter 引导模式对话框。单击对话框上的"清除"按钮时,它将触发提供的回调。
这在第一次调用时效果很好。问题是,在所有后续调用中,单击">清除"按钮时,回调会触发两次。在第一次回调中,我们看到第一次调用的stepId
,在第二次回调中,我们看到当前调用的stepId
。
clearInputTargetName
和 clearInputName
始终是对话框中的正确值。
var Dialog = function (dlgId)
{
var okCallback = null;
var show = function (cb)
{
okCallback = cb;
jQuery.noConflict();
$(dlgId).modal("show");
};
var hide = function ()
{
jQuery.noConflict();
$(dlgId).modal("hide");
};
var onOK = function ()
{
okCallback();
};
var init = function ()
{
$(dlgId + " .okButton").off('click').on('click', function ()
{
onOK(true);
hide();
});
};
init();
return {
show: show,
hide: hide,
init: init
};
};
var ClearInputDialog = function ()
{
var show = function (input, cb)
{
var dlg = new Dialog("#clearInputDialog", input);
$("#clearInputTargetName").text(input);
$("#clearInputName").text(input);
dlg.show(function ()
{
cb(true);
dlg.hide();
});
};
return { show: show };
};
var WorkflowDesignerVM = function ()
{
var clearInput = function ()
{
var name = $(this).attr("data-input");
var stepId = $(this).attr("data-stepid");
var dlg = new ClearInputDialog();
dlg.show(name, function (result)
{
alert('clearing stepId: ' + stepId);
});
};
var init = function ()
{
$(document).on("click", ".clear-input", clearInput);
};
init();
};
var vm = new WorkflowDesignerVM();
模式对话框如下所示:
<div id="clearInputDialog" class="modal fade">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title">Clear Input for <span id="clearInputTargetName">[clearInputTargetName]</span></h4>
</div>
<div class="modal-body">
Are you sure you want to clear <span id="clearInputName">[clearInputName]</span>?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default cancelButton" data-dismiss="modal">Close</button>
<button type="button" id="clearInputButton" class="btn btn-primary okButton" data-stepid="" data-input="">Clear</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
我有一种感觉,它与我的jQuery事件处理程序代码有关。如果我将 Dialog.init 更改为以下代码,那么我们总是得到一个回调,但我们总是看到第一次调用的 stepId。
var init = function ()
{
$(dlgId + " .okButton").on('click', function ()
{
onOK(true);
hide();
$(dlgId + " .okButton").off('click');
});
};
尝试在单击函数中添加事件停止传播,以及添加返回 false。 这将停止任何事件传播或双重调用。 另外,而不是使用 off((.on((...只尝试 .live((,然后,当您准备好删除用户无法使用单击时删除单击事件时,请使用 off((,并将其从内存中删除。
$(dlgId + " .okButton").live('click', function (event) {
event.stopImmediatePropagation();
event = null;
onOK(true);
hide();
return false;
});
相关文章:
- Meteor Router数据函数被调用两次
- Backbone.js ListenToOnce被调用两次
- 当我的单元测试失败时,回调被调用了两次
- 我的jQuery加载请求是否被调用了两次
- 为什么DTM数据元素被调用两次
- jQuery 方法调用了两次
- 模态中的数据关闭在单击时被调用两次
- 调用一个函数两次
- java-script 函数被调用两次
- 查找与通过两次调用地理编码创建的两个 latlng 对象的距离
- Primefaces:RequestContext.execute-调用了两次Javascript
- 在一个页面中包含两次的脚本中调用函数
- 调用随机函数Javascript,但不能两次调用相同的函数
- 如何防止在快速单击时两次调用en事件处理程序
- 在AngularJS中,一次进行两次调用是一种可接受的方法
- jquery停止两次调用委派事件
- 我没有'我不想两次调用自定义函数
- Javascript:两次调用函数会导致不必要的行为
- 当两次调用一个方法时,仅呈现一个SVG组件
- JavaScript在两次调用之间占用额外时间