2009-10-20 17 views
5

Puede ser una pregunta para principiantes, pero no puedo entender por qué el evento onchange nunca es llamado por IE mientras funciona bien con Firefox.evento "onchange" retrasado en IE? (OK con Firefox)

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

La función de ejecución se invoca cuando se hace clic en el botón, pero no cuando se cambia el texto en el cuadro de entrada.

¿Alguna idea?

+0

Quizás pueda echar un vistazo allí: http://support.microsoft.com/?scid=kb%3Ben-us%3B319741&x=11&y=12 parece que el evento onchange tiene un error –

+2

Use un navegador cruzado marco o si no has terminado de encontrar peculiaridades ... – jldupont

Respuesta

15

IE solo activa el evento onchange cuando el elemento pierde el foco: si hiciera clic fuera del elemento o pestaña en un elemento diferente, debería disparar.

Puede evitar esto utilizando un evento diferente, por ejemplo onkeypress.

+2

¿Seguro que solo IE muestra este comportamiento? Acabo de probarlo en FF3.5 e IE7, ambos muestran el mismo comportamiento, es decir, ambos activan el evento después de perder el foco. – msparer

+0

Después de algunos intentos, tengo que admitir que esta es la mejor respuesta. jquery tiene un problema similar con IE. Tuve que usar el evento keydown en lugar de onchange. – luc

+4

Como de costumbre, leer las especificaciones es un buen lugar para comenzar: * "El evento de cambio ocurre cuando un control pierde el foco de entrada y su valor ha sido modificado desde que se enfocó". * - http://www.w3.org/ TR/DOM-Level-2-Events/events.html # Events-eventgroupings-htmlevents – NickFitz

1

IE lo hace después de que su entrada pierde el foco, que no es hasta que haga clic en el botón, tabice o haga clic en otro lugar en la pantalla. Pruebe onclick o uno de los otros eventos.

2

Por lo que recuerdo, IE no maneja el evento de cambio del mismo generador que FF. El evento se disparará cuando se haga clic con el mouse.

que aconsejarle el uso de una biblioteca para gestionar eventos tales como jQuery, Dojo, etc ..

+0

¡Tienes razón! y seguiré tu consejo y usaré jquery para eso – luc

+1

jQuery es una buena recomendación pero tiene un problema similar con onchange e IE – luc

+0

¿Podrías publicar tu código? Recientemente hice algo similar para manejar dos entradas seleccionadas y no tuve problemas. –

2

ohhh, pasé algún tiempo en ese tema como hace meses así. me ocurrió con esta solución de FF/IE onchange

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

Si bien molesto, es no un error que onchange no se dispara hasta el elemento pierde el foco. (Me da en torno al tema por tener varios enlaces para diferentes eventos; asegúrese de no darle una paliza a un controlador y utilizar una agregación de actualización si es apropiado.)

Aquí es el "official" W3C documentation on the subject:

El evento onchange ocurre cuando un control pierde el foco de entrada y su valor ha sido modificado desde que se enfocó. Este atributo se aplica a los siguientes elementos: INPUT, SELECT y TEXTAREA.

Aquí es el MSDN reference:

Este evento es disparado cuando los contenidos están comprometidos y no mientras que el valor está cambiando. Por ejemplo, en un cuadro de texto, este evento no se dispara mientras el usuario está escribiendo, sino en el [se activa] cuando el usuario confirma el cambio dejando el cuadro de texto que tiene el foco.

El comportamiento, mientras que a menudo molesta, es como se especifica .

3

Como se ha respondido en otra parte, IE no activa el evento hasta que hace clic fuera del campo de entrada.

Solo una rápida expansión de cómo lo arreglé con jQuery.(Esta es una traducción de mi código, por lo que puede contener errores ...)

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

... fue cambiado a ...

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

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

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

Para los nuevos en jQuery que son básicamente esperando para que la página se cargue por completo, entonces está agregando el controlador de eventos 'dosomething' al cuadro de entrada.