【发布时间】:2011-11-12 15:57:22
【问题描述】:
从this question 开始,我正在尝试实现一个不显眼的确认对话框。
$(document).ready(function () {
$("[data-confirmPrompt]").click(function (event) {
var confirmPrompt = event.currentTarget.attributes['data-confirmPrompt'].value;
event.preventDefault();
$.prompt(confirmPrompt, {
buttons: { Yes: true, No: false },
callback: function (v, m, f) {
if (v) {
// User clicked Yes. Unbind handler to avoid
// recursion, then click the target element again
$(event.currentTarget).unbind('click');
event.currentTarget.click();
}
}
});
});
});
当用户单击“是”时,我希望执行与事件关联的默认操作。我已经通过取消绑定 jQuery 处理程序并再次单击该元素来完成它。这在提交表单或导航到不同页面时工作正常 - 但当然不适用于启用 AJAX 的页面,我想保留 jQuery 事件处理程序。
是否有其他通用方式来执行默认操作?逻辑上类似于event.executeDefault()。
【问题讨论】:
-
一些想法。 1. 让你的插件“包装”事件处理程序:$('[data-confirmPrompt]').prompt('click', function() { ... }),然后你可以轻松地解除绑定和重新绑定一个特定的事件处理程序触发对话框。
-
2.在元素上设置一个特殊值,以防止第二次触发提示。在点击处理程序的顶部: if ($(this).data('your-flag')) { $(this).data('your-flag', 0);返回真; }。在回调中设置 data('your-flag', true) ,完全不需要解绑点击事件。
-
@Alexey - 谢谢,我一直在考虑您的解决方案 2 - 使用我们过去经常使用的标志来防止重新进入 VB 事件处理程序。如果没有人想出更优雅的东西,我可能会选择它。
-
显然这个问题已经很老了,但是为了后代,这里有一个建议。使用
.on('click',和.off('click')而不是.click和.unbind('click')。然后为事件添加一个命名空间,如下所示:.on('click.confirm',。然后,在删除处理程序时,使用相同的命名空间——.off('click.confirm')。这只会解除您刚刚注册的处理程序的绑定,而不是所有的 jquery 处理程序——怀疑您的 Ajax 调用仍然可以工作。这应该从 jquery 1.7 开始工作。 -
我认为这样做的方法是防止事件冒泡(
event.stopPropagation(),然后是return true。