2010-05-22 23 views
5

Tengo una página con una lista de selección (Página ASP.NET MVC)Html Select List: ¿por qué onchange se llamará dos veces?

La lista de selección y onchange evento especificado como esto:

<%=Html.DropDownList("CompanyID", Model.CompanySelectList, "(select company)", new { @class = "data-entry-field", @onchange = "companySelectListChanged()" })%> 

La función companySelectListChanged está siendo llamado dos veces?

Estoy usando el ingenioso código en this question para obtener la persona que llama.

en ambas ocasiones la persona que llama es el evento onchange, sin embargo si miro a la persona que llama llamadas usando:

arguments.callee.caller.caller 

la primera llamada devuelve un código del sistema como la persona que llama (supongo) y la segunda llamada devuelve indefinidos .

Estoy buscando undefined para que solo reaccione una vez a onchange, pero esto no parece ideal, ¿por qué se llamará onchange dos veces?

ACTUALIZACIÓN:

bien, se encontró al culpable! ... aparte de mí :-) pero el problema de llamar a la función companySelectListChanged dos veces sigue en pie.

El evento onchange se establece directamente en la selección como se mencionó. Esto llama a la función companySelectListChanged.

..notice la clase 'data-entry-field', ahora en un archivo javascript vinculado por separado un evento change en todos los campos con esta clase está vinculado a una función que cambia el color del botón guardar. Esto significa que hay dos eventos en el cambio, pero se llama dos veces a companySelectListChanged.

la unión adicional se fija como sigue:.

$ ('de entrada de datos de campo ') se unen (' pulsación de tecla cambio keyup', function (e) {highLightSaveButtons();});

Asumiendo su posible tener 2 eventos de cambio en la lista de selección, la de suponer que la fijación de pulsación de tecla & eventos keyup puede ser romper algo?

¿Alguna idea?

Otra actualización:

El elemento de selección se ve bien y funciona todo si quito el 'cambio' adicional vinculante. cuando se agrega el enlace 'cambio', el evento se dispara una vez y el 'intercambio' cableado se dispara dos veces.

Si ambos eventos están enlazados a través de jQuery, todo funciona bien, parece que no se pueden mezclar los eventos de cambio encuadernados y jquery enlazados por cable. Supongo que esto responde mi pregunta, pero parece un problema con IE y vincula estos eventos con jquery.

+0

¿Podría aislar el problema en una aplicación simple para la que podría publicar el código completo del controlador y la vista? –

+0

¿Tiene algún otro código que use otro enfoque para unir el controlador de eventos al elemento? Lo que describes parece que la función está registrada como un controlador de eventos * dos veces *: una vez en la configuración directa del atributo 'onclick' y una vez a través de algún otro mecanismo (por ejemplo,' attachEvent() 'o mediante un marco como Prototype o jQuery). – Pointy

+0

El evento onchange está vinculado directamente a la lista de selección como se mencionó, la función companySelectListChanged() llama a otras dos funciones que hacen que las publicaciones de jquery ajax. ningún otro código vincula el evento onchange. –

Respuesta

3

Acepto su valoración. He actualizado mi pequeño ejemplo al http://gutfullofbeer.net/onchange.html para incluir un controlador jQuery además del controlador DOM 0 (el que se configuró con el atributo "onchange"). Parece ser un error de jQuery, o al menos una falla de jQuery para tratar con la rareza de IE.

He registrado el ticket jQuery 6593.

+0

Gracias por su ayuda. –

+0

No hay problema - ¡gracias por descubrir un nuevo error interesante! – Pointy

2

También encontré este problema cuando uso IE8 e hice algunos cambios para solucionarlo.

En lugar de especificar el evento onchange en la lista desplegable, utilicé el evento jquery.change().

de marcado:

@Html.DropDownList("drpList", myList, new { @class = "myClass", id = "drpList" }) 

Guión:

$(function() { 
    $('#drpList').change(function() { 
    .... your functionality 
    }); 
}); 

Esto funciona para mí .. espera que esta ayuda.

Cuestiones relacionadas