从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()
。
答案 0 :(得分:7)
使用Alexey Lebedev在他的第二条评论中提出的建议,我现在的实现现在看起来像下面的示例,除了我还为按钮标签添加了我自己的本地化实现。
注意:
如果有人可以提出改进建议,请加入。
<!-- Examples of usage -->
<input type='submit' data-confirm="OK to delete customer 123?" ... />
<a href="..." data-confirm="OK to navigate?" ... />
<!-- Implementation -->
<script type="text/javascript">
var confirmClickHandler = function (event) {
if ($(event.currentTarget).data('isConfirming')) return;
var message = event.currentTarget.attributes['data-confirm'].value;
event.preventDefault();
$('<div></div>')
.html(message)
.dialog({
title: "Confirm",
buttons: {
"Yes": function () {
$(this).dialog("close");
$(event.currentTarget).data('isConfirming', true);
event.currentTarget.click();
$(event.currentTarget).data('isConfirming', null);
},
"No": function () {
$(this).dialog("close");
}
},
modal: true,
resizable: false,
closeOnEscape: true
});
};
$(document).ready(function () {
$("body").delegate("[data-confirm]", "click", confirmClickHandler);
});
</script>
答案 1 :(得分:4)
我正在做类似的事情,这对我来说很好:
$('#link').click(function(e){
if(!confirm('Are you sure you want to asdf?')){
e.preventDefault();
}
});
答案 2 :(得分:0)
老实说,我不知道这是否能回答你的问题,但这可能会有所帮助。
考虑以下HTML:
<button onclick="alert('Hello world!');" class="btn">Test 1</button>
<button onclick="alert(this.className);" class="btn">Test 2</button>
我已将以下内容添加到$(document).ready
:
$('button').each(function() {
var btn = $(this);
var onClick = btn.attr('onclick');
//replace this with _this
onClick = onClick.replace(/this/g, "_this");
btn.attr('onclick', '');
btn.click(function() {
if (confirm('Do it?')) {
//set _this first!
var _this = btn[0];
eval(onClick);
}
});
});
似乎完成了工作。检查这个jsFiddle示例:http://jsfiddle.net/KeesCBakker/4jThg/。
修改强>
我创建了一些看起来更像你问题的内容:http://jsfiddle.net/KeesCBakker/hqLH5/。只是想不通你正在使用哪个$ .prompt插件,所以我抓住了我从github找到的第一个插件(这个只适用于Chrome:S)。
答案 3 :(得分:0)
我能够通过在更具体的上下文中调用event.stopPropagation()
并确保我不要调用event.preventDefault()
来实现这一目标。虽然您不能明确地调用默认操作 ,但您可以设置条件以使默认操作发生-并根据需要执行其他操作。
// Normal event handler
$("[data-toggle]").click(ev => {
switchToTab(ev.currentTarget)
ev.preventDefault()
})
// Allow default handler in a specific case.
$("[data-toggle] ul a").click(ev => {
// Don't bubble the event to the less specific handler, above
ev.stopPropagation()
// An incorrect return value will also cancel the default action.
return true
})