2011-02-01 14 views

risposta

5

No, non c'è. È possibile verificare che il valore restituito di un comando confirm sia effettivamente true o false ma non è possibile verificare se ci sia visivamente lì.

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

+4

+1 per il fatto che il tuo secondo paragrafo è quasi sicuramente vero. – Moses

+0

@Moses Vi sfido a trovare un collegamento al sistema operativo Windows che consente di verificare acutamente che l'avviso sia fisicamente visualizzato in IE – Raynos

+0

Questo è quello che ho pensato, grazie per le vostre risposte persone !! – Uggers2k

1

Le caselle di conferma e avviso sono eventi di blocco: l'esecuzione del codice Javascript viene interrotta mentre vengono visualizzate. Quindi no - non è possibile rilevare se uno è attualmente visualizzato, per quanto ne so.

+0

È vero che blocca il thread dell'interfaccia utente, ma ciò non significa che sia possibile sniffarlo. –

16

Se si voleva eseguire del codice quando un alert() incendi, si potrebbe provare qualcosa di simile:

ho testato solo in Chrome, quindi non sono sicuro circa il 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 += "<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'); 

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

+0

Anche questo è bello. –

+0

Soluzione dolce! Fatto +1. – kander

+0

non hai alcuna garanzia che l'avviso venga attivato. Supponendo che window.alert sia correttamente implementato! – Raynos

2

Si potrebbe fare questo se si vuole ...

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

}()); 

L'aspetto negativo di questo è che

2

Se si desidera 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 su 3,5 millisecondi. Ma dopo alcuni test siamo stati in grado solo di cliccare o chiudere le finestre di dialogo in circa 5 millisecondi più

+0

Nella conferma() è possibile anche restituire null se il tempo è troppo breve; questo potrebbe essere rilevato sia dai chiamanti che dall'aspetto 'falso' per la maggior parte degli usi normali. –

+0

Ignorare il ritorno a null (o falso) in un intervallo di tempo troppo breve può anche aiutare a impedire la conferma automatica accidentale quando qualcuno invia un modulo, ma tiene premuto il tasto Invio troppo a lungo. –

+0

Questa non è una cattiva idea, ma mi preoccupo di ignorare la decisione degli utenti, potrebbe essere che sapessero che ci sarebbe stata una conferma. Anche se vedo il vantaggio di farlo perché questa è l'unica scappatoia nel farlo. Qualcuno che può tenere premuto aprirà la finestra di dialogo speciale. Ma funzionerà il 99,9% delle volte. – DeadlyChambers

1

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