Rileva se un avviso o una conferma è visualizzata su una pagina

C’è un modo utilizzando JavaScript o jQuery per rilevare se viene visualizzata una finestra di conferma o di avviso?

Se si desidera eseguire un codice quando viene alert() un alert() , è ansible provare qualcosa del genere:

Ho provato solo su Chrome, quindi non sono sicuro del supporto del browser.

Esempio: 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 += "
alerting"; _old_alert.apply(window,arguments); // run some code after the alert document.body.innerHTML += "
done alerting
"; }; })(); alert('hey'); alert('you'); alert('there');

Naturalmente questo consente di eseguire il codice solo prima e dopo un avviso. Come notato da @kander, l’esecuzione di JavaScript viene interrotta mentre viene visualizzato l’avviso.

No non c’è. È ansible verificare che il valore di ritorno di un comando di confirm sia effettivamente true o false ma non è ansible controllare se ci sia visivamente lì.

Queste cose fanno parte del browser non parte del DOM. Sono sicuro che c’è un trucco sporco che funziona per IE perché è un figlio bastardo del sistema operativo Windows.

Potresti farlo se vuoi …

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

Il lato negativo di questo è quello

Se vuoi rilevare se questi sono bloccati. Dovrai fare le tue cose con il messaggio che ti verrà visualizzato ma ignorare l’avviso nativo / confermare.

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

Ovviamente ho impostato il tempo a 3,5 millisecondi. Ma dopo alcuni test siamo stati in grado di cliccare o chiudere le windows di dialogo in circa 5 millisecondi più

Le caselle di conferma e avviso sono bloccanti: l’esecuzione del codice Javascript viene interrotta mentre vengono visualizzate. Quindi no – non è ansible rilevare se uno è attualmente visualizzato, per quanto ne so.

Per aggiungere alla risposta di @ user113716 puoi contare sul tempo. Presumo che se la finestra di dialogo di conferma impiega meno di 200 ms, viene bloccata dal browser. Sotto restituisco true se la finestra di conferma è bloccata (per impostazione predefinita restituisce false, il codice è in 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; }