Есть ли способ использовать JavaScript или jQuery для обнаружения отображения окна подтверждения или предупреждения?
Обнаружение, если на странице отображается предупреждение или подтверждение
Ответ 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;
}