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

IT技术 javascript jquery alert
2021-02-20 16:21:05

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

6个回答

如果你想在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 执行会停止。

@Raynos:如果你在谈论浏览器支持,是的,我假设。我在回答中指出我只在 Chrome 中测试过,除此之外我不确定。还是我误解了你的评论?
2021-04-18 16:21:05
哦,我实际上的意思是检测您的浏览器中是否实际显示了您的标准警报对话框。没有办法以编程方式保证它是。
2021-04-22 16:21:05
您无法保证警报会触发。您假设 window.alert 已正确实施!
2021-04-24 16:21:05

不,那里没有。您可以检查confirm命令的返回值是否确实存在truefalse但无法直观地检查是否存在。

这些东西是浏览器的一部分,而不是 DOM 的一部分。我确信有一个适用于 IE 的肮脏黑客,因为它是 Windows 操作系统的一个混蛋。

@Moses 我挑战你找到一个指向 Windows 操作系统的链接,它允许你实际检查警报是否物理显示在 IE 中
2021-04-20 16:21:05
有很多方法可以检查这一点。你可以做两件我知道的事情 - 1)在之前alertconfirm(见下面的答案)之前注入你自己的处理程序,或者 2)以一个时间间隔(setInterval设置一个函数来找出 UI 线程最后一次解锁的时间(尽管长时间滞后不一定只是来自一个alert()或者confirm()它可能已经足够了)。
2021-05-03 16:21:05
+1 因为你的第二段几乎肯定是真的。
2021-05-10 16:21:05
@DanBeam 我将这个问题解释为如何确保在客户端上按预期显示警报。那只是断言您的代码调用了该window.alert函数。它不在 DOM 中。
2021-05-15 16:21:05

如果你愿意,你可以这样做...

(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'));
    };

}());

这样做的缺点是

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

它们确实阻塞了 UI 线程,但这并不意味着您可以嗅探到它。
2021-04-24 16:21:05

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

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 毫秒内点击或关闭对话框

这是真的; 是否强制用户阅读确认消息可能是特定于用例的。
2021-04-19 16:21:05
这不是一个坏主意,但我担心覆盖用户的决定,可能是他们知道会有一个确认。尽管我确实看到了这样做的好处,因为这是这样做的一个漏洞。可以按住 enter 的人将触发特殊对话框。但它会在 99.9% 的时间内工作。
2021-04-26 16:21:05
在太短的时间范围内覆盖返回 null(或 false)还有助于防止在有人提交表单帖子但按住 Enter 键太长时间时意外自动确认。
2021-04-28 16:21:05
在confirm() 中,如果时间范围太短,您也可以返回null;这既可以被调用者检测到,也可以在大多数正常使用中看起来像“错误”。
2021-05-08 16:21:05