2009-10-20 14 views
5

Potrebbe essere una domanda per principianti ma non riesco a capire perché l'evento onchange non venga mai chiamato da IE mentre funziona Ok con firefox.evento "onchange" ritardato in IE? (ok con Firefox)

<input type="text" id="mytext" size="48" value="" onchange="execute()"/> 
<button type="button" onclick="execute()">Go</button> 

La eseguire funzione viene chiamata quando il pulsante viene premuto, ma non quando il testo nella casella di input è cambiato.

Qualche idea?

+0

Forse puoi dare un'occhiata qui: http://support.microsoft.com/?scid=kb%3Ben-us%3B319741&x=11&y=12 sembra che l'evento onchange abbia un bug –

+2

Usa un cross-browser quadro o stranezze trovare altrimenti non è finito ... – jldupont

risposta

15

IE spara solo l'evento onchange quando l'elemento perde lo stato attivo: se si dovesse fare clic all'esterno dell'elemento o scheda su un elemento diverso, questo dovrebbe attivarsi.

Si può ovviare a questo utilizzando un evento diverso, ad esempio onkeypress.

+2

Certo che solo IE mostra questo comportamento? L'ho appena testato su FF3.5 e IE7 - entrambi mostrano lo stesso comportamento, entrambi sparano all'evento dopo aver perso l'attenzione. – msparer

+0

Dopo alcuni tentativi, devo ammettere che questa è la migliore risposta. jquery ha un problema simile con IE. Ho dovuto usare l'evento keydown piuttosto che onchange. – luc

+4

Come al solito, la lettura delle specifiche è un buon punto di partenza: * "L'evento change si verifica quando un controllo perde lo stato attivo di input e il suo valore è stato modificato da quando ha ottenuto il focus." * - http://www.w3.org/ TR/DOM-Level-2-Events/events.html # Events-eventgroupings-htmlevents – NickFitz

1

IE lo fa dopo l'ingresso non è più attivo, che non è fino a quando si fa clic sul pulsante, scheda fuori, o fare clic su un altro punto della schermata. Prova onclick o uno degli altri eventi.

2

Per quanto mi ricordo, IE non gestisce onchange evento stesso maner come FF. L'evento verrà generato quando si fa clic con il mouse.

io consiglio di utilizzare una libreria per gestire gli eventi, come jQuery, Dojo, ecc ..

+0

Hai ragione! e seguirò il tuo consiglio e userò jquery per quello – luc

+1

jQuery è una buona raccomandazione ma ha un problema simile con onchange e IE – luc

+0

Potresti pubblicare il tuo codice? Di recente ho fatto una cosa simile per gestire due input selezionati e non ho avuto problemi. –

2

ohhh, ho trascorso qualche tempo su questo tema così mesi fa. Sono venuto con questa soluzione per FF/IE onchange

$("input[name*='delivery_method']").bind(($.browser.msie ? "click" : "change"), function() { 
    //your code here 
}); 
6

Mentre fastidioso, è non è un bug cheonchange non viene generato fino l'elemento perde il focus. (I aggirare il problema di avere più associazioni per i diversi eventi; assicurarsi di non clobber un gestore e utilizzare un aggregazione di aggiornamento, se necessario.)

Ecco la "official" W3C documentation on the subject:

L'evento onchange verifica quando un controllo perde lo stato attivo di input e il suo valore è stato modificato da quando ha ottenuto il focus. Questo attributo si applica ai seguenti elementi: INPUT, SELECT e TEXTAREA.

Ecco la MSDN reference:

Questo evento è sparato quando il contenuto si impegnano e non, mentre il valore sta cambiando. Ad esempio, in una casella di testo, questo evento non è sparato mentre l'utente sta scrivendo, ma piuttosto [è sparato] quando l'utente si impegna la modifica lasciando la casella di testo che ha il focus.

Il comportamento, sebbene spesso fastidioso, è come specificato.

3

come risposta altrove, IE non genera l'evento fino a che fa clic al di fuori del campo di inserimento.

Solo una breve expaination di come ho riparato con jQuery.(Questa è una traduzione del mio codice, quindi potrebbe contenere bug ...)

<input id="somecheck" name="somecheck" value="1" onchange="dosomething();"> 

... è stato cambiato in ...

<input id="somecheck" name="somecheck" value="1"> 

<script language="javascript"> 
$(document).ready(function() { 

    $('#somecheck').change(function() { dosomething(); }); 
}); 
</script> 

Per chi è nuovo a jQuery si sono fondamentalmente aspettando affinché la pagina sia completamente caricata, si aggiunge il gestore di eventi 'dosomething' alla casella di input.