Подтвердить что ты не робот

Обнаружение, если на странице отображается предупреждение или подтверждение

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

(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(), haha ​​

Ответ 4

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

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 миллисекунд плюс

Ответ 5

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

Ответ 6

Чтобы добавить к @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;
    }