2010-02-28 6 views
5

Il listener di eventi Prototipo che uso per i cambiamenti nel selezionare i menu non vengono attivati ​​in IE.Event.observe eventi 'cambiamento' non essere innescati in IE

Event.observe('use_billing', 'change', Checkout.getBillingData); 

Questo funziona bene in Firefox (ovviamente), ma non succede nulla in IE (ovviamente) - Sono stato Googling questo per qualche tempo, ma non ho trovato una soluzione adeguata a questo problema. Leggo che ci sono problemi, ma non ho trovato nulla di utile per aggirare il problema e farlo funzionare.

Sto davvero cercando di evitare l'uso di trigger di evento in linea, perché sono invadente e fare per un documento disordinato soggetto ad errori:

<select id='use_billing' onchange="Checkout.getBillingData();">....</select> 

Tutte le idee sarebbero grandi - questa è l'unica cosa fermare questo progetto passando dalla beta alla produzione.

risposta

2

Ho trovato il motivo - non era il problema di messa a fuoco, si scopre che ho avuto il nome dell'elemento del modulo e valori di id lo stesso - ho cambiato il valore id e tutto ha funzionato bene.

3

Questo è un problema comune con IE. Non fa scattare eventi change finché l'elemento non si concentra.

Per verificare se questa è davvero la causa del problema, provare a cambiare il menu e quindi scheda premendo per spostare la vostra attenzione su un altro elemento. Se il tuo callback si attiva correttamente, saprai che non ci sono altri problemi.

Ho già risolto questo problema ascoltando anche altri eventi come click o keydown. È possibile aggiungere un controllo per il callback per garantire che il valore è in realtà diverso da prima per garantire che non si sta elaborando l'evento più volte del necessario (dal momento che gli altri browser spareranno sia click e change allo stesso tempo, se si clicca su un nuovo valore).

2

So che questo è un argomento vecchio, ma ho voluto condividere una risposta alternativa a quella di cui sopra. Nel mio codice il nome e l'id dell'elemento erano gli stessi ma non importava.

Nella funzione che viene sparato l'argomento dell'evento è stato sempre passato in da prototipo. Per ottenere il valore della casella di testo (che ha generato l'evento) in Firefox si utilizza eventArg.currentTarget.value

ma in IE è necessario utilizzare eventArg.srcElement.value

Quindi, al fine di farlo funzionare in entrambi i browser è necessario utilizzare ...

var value = "";
var id = "";
if(eventArg.currentTarget){//FireFox
value = eventArg.currentTarget.value;
id = eventArg.currentTarget.id;
}
else{//IE
value = eventArg.srcElement.value;
id = eventArg.srcElement.id;
}