2013-12-17 25 views
6

Si consideri il seguente codice HTML:setTimeout - strano comportamento

<html> 
    <head></head> 
    <body> 
     <input type="text" onblur="window.setTimeout('document.title += 2;', 0);" /> 
     <input type="button" onclick="document.title += 1" /> 
    </body> 
</html> 

[Demo with 0 delay, 100ms delay, 150ms delay]

E le seguenti operazioni:

  • utente inserisce l'ingresso (messa a fuoco).
  • L'utente fa clic sul pulsante.

Ora, gli eventi si sarebbe verificato il seguente ordine:

  • Ingresso evento Testo sfocatura.
  • Evento clic sul pulsante.

Testing questo su tutti i browser raggiungibili ottengo:

document.title = '21' //Expected behavior 

Ma! Sul navigatore produzione (Windows XP + IE 7), ottengo:

document.title = '12' //Unexpected behavior 

Ho anche provato la simulazione in modalità IE 7 sulla mia macchina locale (IE 10), non poteva riprodurla tho.

Questo è ovviamente un esempio semplificato del problema che sto avendo. Altrimenti potrei semplicemente sbarazzarmi del setTimeout.

Nello scenario reale, la chiamata setTimeout viene effettivamente effettuata da una libreria di script di terze parti (componenti ASP.NET Dev Express).

Oltre alla soluzione effettiva a questo problema (che penso di poter gestire), quale spiegazione potrebbe essere applicata a questo comportamento?

Aggiornamento:

Usando l'espressione new Date().getTime() per ottenere il tempo di ogni passo eseguito dal browser. Succede come segue:

1387369361417 //document.title += 1 
1387369361433 //document.title += 2 
+1

Forse IE7 attiva l'evento click prima dell'evento di sfocatura? * "In tal caso, l'evento click del pulsante non può accadere prima della funzione sfocatura." * Di quanto sei sicuro? –

+1

@Felix Kling: No, senza il setTimeout, effettivamente valuta come 'document.title = '21'' –

+0

Se non si utilizza la funzione window.setTimeOut e si scrive' onblur = "document.title + = 2; "', qual è l'output? – ProGM

risposta

1

due possibilità:

  1. tuo click (MouseDown MouseUp +) è terminato prima del tempo di timeout minimo di IE7.
  2. Lo stato del mouse sta bloccando gli script. Gli eventi devono attendere il completamento di altri script e interazioni dell'utente prima che vengano attivati. E data la storia della stranezza/terrificabilità della sceneggiatura-UI in IE, scommetterei sul fatto che il mouse "inizia un'interazione con l'utente" e il mouesup "conclude l'interazione dell'utente". Caricare questo in IE7:

    <input type="text" onblur="window.setTimeout('output(2));', 0); output(3);" /> 
    <input type="button" onclick="output(1);" /> 
    

    http://jsfiddle.net/sMcE3/

    ... e dopo che ci si concentri() 'd sul campo di testo, fare clic su tale pulsante reale lento come. Immagino che vedrai 312. (In contrasto con lo 321 che mostrerà un browser half-decent.)

+0

Se scatto molto lento, sto diventando 321. sembra che l'evento sfocatura sarebbe accaduto prima della MouseUp. E l'evento click eseguirebbe solo dopo mouseup. –

+0

Ah. che suona più come possibilità n. 1 allora. – svidgen