检测页面上是否显示警报或确认

时间:2011-02-01 19:19:36

标签: javascript jquery alert

有没有办法使用JavaScript或jQuery来检测是否正在显示确认或警告框?

6 个答案:

答案 0 :(得分:19)

如果你想在alert()触发时运行一些代码,你可以尝试这样的事情:

我只在Chrome中测试过,所以我不确定是否支持浏览器。

示例: http://jsfiddle.net/Q785x/1/

(function() {
    var _old_alert = window.alert;
    window.alert = function() {
                     // run some code when the alert pops up
        document.body.innerHTML += "<br>alerting";
        _old_alert.apply(window,arguments);
                     // run some code after the alert
        document.body.innerHTML += "<br>done alerting<br>";
    };
})();

alert('hey');
alert('you');
alert('there');

当然,这只允许您在警报之前和之后运行代码。正如@kander所说,在显示警报时,javascript执行暂停。

答案 1 :(得分:5)

不,没有。您可以检查confirm命令的返回值是否确实为truefalse,但您无法检查是否存在视觉效果。

这些东西是浏览器的一部分,不属于DOM。我确定有一个适用于IE的脏黑客,因为它是Windows操作系统的一个卑鄙的孩子。

答案 2 :(得分:2)

如果你想......你可以这样做。

(function () {

    // remember the normal alert
    var oldAlert = (function(){ return this.alert; }()),
        oldConfirm = (function(){ return this.confirm; }());

    // inject ourself into the window.alert and window.confirm globals
    alert = function (msg) {
        oldAlert.call(document, msg);
        document.onAlert(msg);
    };
    confirm = function (msg) {
        var result = oldConfirm.call(document, msg);
        document.onConfirm(msg, result);
        return result;
    };

    // these just chill and listen for events
    document.onAlert = function (msg) {
        window.console && console.log('someone alerted: ' + msg);
    };
    document.onConfirm = function (msg) {
        window.console && console.log('someone was asked: ' + msg);
        window.console && console.log('and they answered: ' + (msg ? 'yes' : 'no'));
    };

}());

这样做的缺点是

答案 3 :(得分:2)

如果您想检测这些是否被阻止。您将不得不使用您将不相信的消息做自己的事情,但覆盖本机警报/确认。

window.nativeAlert = window.alert;
window.alert = function (message) {
var timeBefore = new Date();
var confirmBool = nativeAlert(message);
var timeAfter = new Date();
if ((timeAfter - timeBefore) < 350) {
    MySpecialDialog("You have alerts turned off, turn them back on or die!!!");
  }
}

window.nativeConfirm = window.confirm;
window.confirm = function (message) {
var timeBefore = new Date();
var confirmBool = nativeConfirm(message);
var timeAfter = new Date();
if ((timeAfter - timeBefore) < 350) {
    MySpecialDialog("You have alerts turned off, turn them back on or die!!!");
}
 return confirmBool;
}

显然我已将时间设置为3.5毫秒。但经过一些测试,我们只能在大约5毫秒加上

点击或关闭对话框

答案 4 :(得分:1)

确认和警告框阻止事件 - 在显示这些事件时,Javascript代码将暂停执行。所以不 - 据我所知,你无法检测到当前是否正在显示一个。

答案 5 :(得分:1)

要添加到@ user113716的答案,您可以依靠时间。我假设如果确认对话框花了不到200毫秒,它将被浏览器阻止。如果确认对话框被阻止,则返回true(默认情况下,它返回false,代码在TypeScript中)。

    let oldConfirm = window.confirm;
    window.confirm = (msg) => {
        let time = new Date().getTime();
        let conf = oldConfirm(msg);

        return new Date().getTime() - time > 200 ? conf : true;
    }