小编典典

要解决的JavaScript难题:window.confirm = divConfirm(strMessage)

ajax

场景是:旧站点,其中已经编写了许多JS代码。如果用户想将所有警报消息更改为基于新时代爵士乐Div的警报,则使用JQuery,YUI,Prototype
…等非常常见。
主要有树JS对话框
1.警报

要更改它的简单性,我们只需要编写新函数即可显示div弹出窗口并显示消息,然后覆盖窗口。

` function showDivAlert(strMessage){
//div popup logic and code
}

window.alert = showDivAlert;
`

2.提示

这个看起来很容易编写的函数可以接受字符串并显示输入值的文本框。现在,由于单击“确定”按钮即可返回操作,因此此处的生活很容易。

function shoDivPromp(strMessage){ //div pop up to show the text box and accept input from the user } window.prompt = shoDivPromp;

3.确认

现在上面的两个很容易覆盖和修改默认对话框,但是确认很复杂。
但是,默认的JS确认对话框将停止JS执行,并且当用户单击确定或通过确定返回值(true / false)恢复取消执行时。但是,如果我们使用div
popup,执行就不会停止,这是有问题的。
我们仍然可以实现确认,但是在那种情况下,我们必须为OK和CANCEL情况绑定方法,这些方法将附加到OK和CANCEL按钮上。有了这个功能,签名就会像。
function newConfirm(msg, fun OkAction(), fun CancelAction)

现在的问题是,这不能像我们使用alert()一样帮助我更改整个站点的确认对话框。 问题
我不确定是否可以实现,但是我认为可以使用某些JS模式。所以让我知道是否可能。


阅读 406

收藏
2020-07-26

共1个答案

小编典典

现在的问题是,这不能像我们使用alert()一样帮助我更改整个站点的确认对话框。

没错 无法在本机JavaScript中重现alert / confirm /
prompt函数的同步性质。有一种非标准的方法showModalDialog可以使用单独的弹出式文档来执行此操作,但是并非所有浏览器都支持该方法,通常认为这是非常不可取的。

因此,插件替换策略无法正常工作。您将不得不在脚本的其余部分中更改调用这些方法的每个位置。

通常的模式是使用内联匿名函数执行此操作,以使用闭包(例如)保留局部变量。更换:

function buttonclick() {
    var id= this.id;
    if (confirm('Are you sure you want to frob '+id+'?'))
        frob(id);
    wipe(id);
}

与:

function buttonclick() {
    var id= this.id;
    myConfirm('Are you sure you want to frob '+id+'?', function(confirmed) {
        if (confirmed)
            frob(id);
        wipe(id);
    });
}

如果需要this保留,则需要查看另一个嵌套的闭包或function.bind来完成。如果您要confirm循环调用,则事情会变得更加困难。

显然,您还必须确保在确认框打开时,关键的全局状态不会改变。通常,通过将页面的其余部分显示为灰色以使点击无法通过,可以将这种风险降到最低。但是,如果超时,它们仍然可以触发。

2020-07-26