Определить, отображается ли предупреждение или подтверждение на странице - PullRequest
19 голосов
/ 01 февраля 2011

Есть ли способ с помощью JavaScript или jQuery определить, отображается ли окно подтверждения или предупреждения?

Ответы [ 6 ]

19 голосов
/ 01 февраля 2011

Если вы хотите запустить некоторый код при срабатывании 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 прекращается, пока отображается предупреждение.

5 голосов
/ 01 февраля 2011

нет там нет. Вы можете проверить, что возвращаемое значение команды confirm действительно true или false, но вы не можете проверить, есть ли там визуально.

Эти вещи являются частью браузера, а не частью DOM. Я уверен, что есть грязный взлом, который работает для IE, потому что это подделанный ребенок ОС Windows.

2 голосов
/ 16 мая 2014

Если вы хотите определить, не блокируются ли они.Вам придется сделать свое дело с сообщением, которое вы будете выводить, но переопределите нативное предупреждение / подтверждение.

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 голосов
/ 01 февраля 2011

Вы можете сделать это, если хотите ...

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

}());

Недостатком этого является то, что

  • вы взламываете метод хоста браузера (как правило, вы не должны это делать - http://perfectionkills.com/whats-wrong-with-extending-the-dom/)
  • вам просто лучше следить за вашим alert() confirm() использованием, хаха
1 голос
/ 13 мая 2016

Чтобы добавить ответ @ 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 голос
/ 01 февраля 2011

Окна подтверждения и предупреждения блокируют события - выполнение кода Javascript останавливается, пока они отображаются.Так что нет - насколько я знаю, вы не можете определить, отображается ли он в данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...