Javascript JS-暂停自定义警报()

Javascript JS-暂停自定义警报(),javascript,jquery,Javascript,Jquery,我编辑了默认的alert()函数,如下所示: window.alert = function(str){ //custom alert } 基本上,新函数将显示一个HTML模式 背景故事: 我想回答这个问题,因为我有个问题。警报将隐藏,并在调用自定义警报函数时显示。因此,自定义警报基本上是显示元素并更改其文本因此,当我有多个alert()调用时,只显示最后一条消息!:( 但是,与默认警报框不同,它当然不会像默认的alert()函数一样在警报消失之前暂停网页 是否可以模仿这种“暂停网页”

我编辑了默认的
alert()
函数,如下所示:

window.alert = function(str){
    //custom alert
}
基本上,新函数将显示一个HTML
模式

背景故事:

我想回答这个问题,因为我有个问题。警报将隐藏,并在调用自定义警报函数时显示。因此,自定义警报基本上是显示元素并更改其文本因此,当我有多个
alert()
调用时,只显示最后一条消息!:(

但是,与默认警报框不同,它当然不会像默认的
alert()
函数一样在警报消失之前暂停网页

是否可以模仿这种“暂停网页”行为?

另外,除了使用
setTimeout()
检查
isCustomAlertOpen==true
延迟另一个自定义警报触发,直到当前警报被解除之外,还有其他方法吗?


编辑: 是否有办法将自定义警报排队?

我不介意jQuery,但我认为它在这里可能会被压倒

我的题目不好。有人能为我想出一个更好的题目吗

有可能模仿这种“暂停网页”的行为吗

答案是否定的。有一些方法可以阻止ui(同步ajax调用、长循环等)。但是当用户单击ok按钮时,您将无法停止这些操作

更好的方法是重新构造代码,使其不同步运行。也就是说,您不需要在等待用户时阻塞ui

另外,除了使用setTimeout()检查isCustomAlertOpen==true是否延迟另一个自定义警报触发,直到当前警报被解除,还有其他方法吗


一种方法是:不要在一个地方设置标志,然后在另一个地方重复检查。你可以使用事件的概念。代码的一部分等待触发事件,另一部分触发事件。jQuery中有一个库可以为你做这件事,或者你可以阅读它,然后自己编写。

没有办法阻止执行,因为JavaScript是异步的(除了3个模态函数和XmlHttpRequest)

出于同样的原因,您不能等待上一个警报关闭,但您可以使用事件来使用此模式创建警报堆栈:

window.alert = (function() {
    var stack = [];

    var showNextAlert = function() {
        var div = document.createElement("div");
        /* Here, configure the div, show the string from stack[0] and add it to the document ... */
        var okButton = /* ... */;

        okButton.addEventListener("click", function() {
            div.parentNode.removeChild(div);

            stack = stack.slice(1);

            if(stack.length > 0) {
                showNextAlert();
            }
        });
    }

    return function(msg) {
        stack.push(msg);

        if(stack.length == 1) {
            // Show it immediately if the stack is empty
            showNextAlert();
        }
    };
})();

您还应该为该函数使用另一个名称,而不是更改本机属性(此处为
window.alert
)。

alert()的“暂停”行为通常被认为是一件坏事。它可能会导致不稳定的行为,因为当警报出现在屏幕上时,事件仍然可以被触发,但在触发事件时,它们不会发生,而是排队等待警报被清除。当警报被清除时,它们将被运行,但可能不会按照您期望的顺序运行hem to be。如果你在定时事件方法中有一个警报,那就更糟糕了——在显示原始警报时,事件仍然会被触发,因此你可能会遇到不可阻挡的警报框。此外,如果你能够暂停网站,你(技术上)感觉如何计划再次恢复吗?@Siguza,直到警报对话框被取消。那么,事件大概会继续continue@Simba哦~我现在明白了。但是现在我想让警报框排队。有办法吗?有。但是不要这样做。
setInterval(函数(){alert(“噢,救命啊,我被警报框包围了”);},100);
(提示:真的;你不想运行此代码)我从来没有想过JS中的“排队”。谢谢。我想我会尝试这个概念!我可能会在尝试后接受你的答案。:)问一个问题,
return function
是否以
msg
作为参数再次运行匿名警报函数?@DanielCheung否,返回的函数将在
窗口中可见。警报
。这称为模块模式。此答案包含一些我以前没有见过的内容。让我研究一下首先,我会问你更多。:)我让它工作了。谢谢我以前从未使用过这种类型的代码。我学到了一些新东西:)我指的是(…)上的
$(elem).和(…)
上的
$(elem).触发器(…)
。但你仍然需要像塞巴斯蒂安·C·秀那样排队