Ho riscontrato un comportamento imprevisto di JS setTimeout
quando finestre di dialogo modali come alert
sono aperte e vorrei sapere il motivo.Perché le finestre dei messaggi modali JS sospendono il conto alla rovescia su setTimeout()?
Mi aspettavo che setTimeout (fn, 10000) significhi "controllare l'ora corrente periodicamente e quando è maggiore di Ora + 10000 ms attiva il gestore di eventi che invocherà la funzione 'fn' passata". Sarebbe logico vedere come passiamo la misura del timeout come "ms da ora". Ma, a quanto pare, il conto alla rovescia su setTimeout
è un conto alla rovescia letterale e verrà messo in pausa mentre una finestra modale è aperta.
setTimeout(function(){
//alert A
alert("10 seconds have passed for the first setTimeout")
}, 10000);
setTimeout(function(){
//alert B
alert("Wait for 15 seconds and press OK");
},1000);
mi aspetterei avviso A per visualizzare subito dopo la chiusura avviso B (presumendo che si aspettato per 15 sec. A farlo), dal momento che avvisare un timeout era solo per 10 secondi e sono già passato. La pratica, tuttavia, mostra che il conto alla rovescia per avvisare A viene semplicemente messo in pausa mentre l'avviso B è aperto e verrà mostrato solo dopo ca. Sono passati 9 secondi in più dopo che hai chiuso l'avviso B, indipendentemente dal tempo in cui B era aperto.
Questo non sembra logico.
Aggiornamento . Non sono sicuramente l'unico confuso qui, perché questo comportamento di sospendere il timeout si verifica in Chrome e Internet Explorer, ma non in Firefox. Firefox esegue il comportamento che mi aspettavo - se si attende per 15 secondi in caso di avviso B - l'avviso A si apre istantaneamente quando lo si chiude.
Questo è uno dei motivi per cui 'alert's non sono buone soprattutto con funzioni di temporizzazione. – soktinpk
@soktinpk Usiamo cose come Bootbox per avvisi nei nostri progetti, ma ci sono momenti in cui non è applicabile, come quando è necessario avvisare l'utente dei dati non salvati alla chiusura della pagina. Non riesco a immaginare persone che si trovano nei guai a causa di questo comportamento troppo spesso, eppure, una grande differenza di comportamento tra i tre grandi browser è interessante. –
Avviso un utente sui dati non salvati è un uso perfettamente valido per 'alert' e/o' confirm'. Tuttavia, perché dovresti aspettare un po 'prima che venga visualizzato l'avviso? – soktinpk