在保留回调函数的情况下覆盖JavaScript Confirm()函数

7


直截了当地说,我想在jQuery插件中覆盖标准的js confirm()函数。我已经通过下面的简单函数布局找出了如何实现。

function confirm(opts) {
   //code
}

现在,我想在上面的confirm函数中调用另一个函数,就像这样...
function confirm(opts) {
   openModal(opts);
}

openModal函数将打开一个带有消息和所需按钮的自定义模态窗口。这些按钮都是带有idsubmitcancel<span>元素。 submit返回true,而cancel返回false。但现在,如何根据单击的按钮返回true或false呢?

例如...

$('#openModal').live('click', function() {
   var opts = { title:'Modal Title', message:'This is a modal!' };
   var resp = confirm(opts);
   if(resp) 
      // user clicked <span id="submit"></span>
   else 
      // user clicked <span id="cancel"></span>
});

希望你能理解我的意思。

1个回答

17

这是可以实现的,但不完全符合你的描述。通常使用 confirm 函数的方式是:

if(confirm("Are you sure you want to submit this form?")) {
    form.submit();
}
在上面的示例中,按钮按下后会同步返回到脚本。在函数内部暂停执行,直到按下按钮。
“模态对话框”只是覆盖整个HTML网页内容的遮罩层。对于浏览器来说,在这种叠加层上的按钮与网页其他位置的按钮工作方式相同。
由于JavaScript使用回调函数来处理事件而不是同步处理此类按钮点击事件,因此您尝试的方法将无法正常工作。
您需要更改代码中使用confirm函数的所有部分,使其看起来像这样:
confirm("Are you sure you want to submit this form?", function(result) {
    if(result) {
        form.submit();
    }
});

这将与使用jQuery自身注册事件处理程序一样工作。脚本执行立即继续,跳过匿名函数中的所有代码。稍后,浏览器将通过在confirm函数中注册的JavaScript事件处理程序间接调用该函数,其目的是使用适当的truefalse调用回调函数。


2
+1 我发现原来真正模态的confirm()方式不可能被模仿,但事实就是这样。 - Pekka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接