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
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? –
@Felix Kling: No, senza il setTimeout, effettivamente valuta come 'document.title = '21'' –
Se non si utilizza la funzione window.setTimeOut e si scrive' onblur = "document.title + = 2; "', qual è l'output? – ProGM