在保留回调的同时覆盖Javascript Confirm()

时间:2010-10-07 22:09:04

标签: jquery callback override confirm


至此,我想在jQuery插件中覆盖标准的js confirm()函数。我已经想出了如何使用下面的简单功能布局。

function confirm(opts) {
   //code
}

现在,我要做的是在上面的confirm函数中调用另一个函数,就像这样......

function confirm(opts) {
   openModal(opts);
}

openModal功能将打开一个带有消息和必需按钮的自定义模态窗口。这些按钮均为<span>idsubmitcancelsubmit返回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 个答案:

答案 0 :(得分:14)

可能但不完全如您所述。使用确认功能的典型方法是:

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调用回调函数。