web-dev-qa-db-ja.com

アラートまたは確認がページに表示されているかどうかを検出します

JavaScriptまたはjQueryを使用して、確認ボックスまたはアラートボックスが表示されているかどうかを検出する方法はありますか?

19
Uggers2k

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の実行は停止されます。

20
user113716

いいえ、ありません。 confirmコマンドの戻り値が確かにtrueまたはfalseであることを確認できますが、視覚的にそこにあるかどうかは確認できません。

これらはブラウザの一部であり、DOMの一部ではありません。 IEはWindows OSの粗末な子であるため、動作するダーティなハックがあると確信しています。

5
Raynos

これらがブロックされているかどうかを検出する場合。表示するメッセージで独自の処理を行う必要がありますが、ネイティブアラート/確認をオーバーライドします。

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ミリ秒以上でダイアログをクリックまたは閉じることができました。

2
DeadlyChambers

あなたがしたい場合はこれを行うことができます...

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

}());
_

これの欠点は、

2
Dan Beam

@ 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;
    }
1

確認ボックスとアラートボックスがイベントをブロックしています-これらが表示されている間、Javascriptコードの実行は停止されます。ですから、私が知る限り、現在表示されているかどうかを検出することはできません。

1
kander