2009-10-28 17 views
52

Tengo una página con un número variable de elementos <select> (lo que explica por qué estoy usando la delegación de eventos aquí). Cuando el usuario cambia la opción seleccionada, quiero ocultar/mostrar diferentes áreas de contenido en la página. Aquí está el código que tengo:jQuery change event en <select> no activada en IE

$(document).ready(function() { 
    $('#container').change(function(e) { 
    var changed = $(e.target); 

    if (changed.is('select[name="mySelectName"]')) { 
     // Test the selected option and hide/show different content areas. 
    } 
    }); 
}); 

Esto funciona en Firefox y Safari, pero en IE el evento de cambio no se dispara. Alguien sabe por qué? ¡Gracias!

+1

Según MSDN, el evento de cambio no burbujea en el IE, por lo menos jQuery está haciendo un poco de magia, delegación de eventos no funcionará: http://msdn.microsoft.com/en-us/library/ms536912 (VS.85) .aspx – NickFitz

Respuesta

70

El evento change no burbujea en el IE (Ver here y here). No puede usar la delegación de eventos en conjunto con ella.

De hecho, es a causa de este fallo de IE que jQuery live tuvo que excluir oficialmente change de los list of supported events (FYI los estados de especificaciones DOM change should bubble) . [1]

Con respecto a su pregunta, puede enlazar directamente a cada seleccione:

$('#container select').change(/*...*/) 

Si realmente quiere delegación de eventos que podría encontrar algún éxito tratando lo this person did y se unen a click sólo en IE, que hace burbuja:

$('#container').bind($.browser.msie ? 'click' : 'change', function(event) { 
    /* test event.type and event.target 
    * to capture only select control changes 
    */ 
}) 

Pero esta detección de navegador se siente realmente mal. Realmente trataría de trabajar con el ejemplo anterior (vinculando directamente a los menús desplegables). A menos que tenga cientos de cajas <select>, la delegación de eventos no le comprará mucho aquí de todos modos.


[1] Nota: jQuery> = 1.4 ahora simula un evento de propagación change en IE a través de live()/on().

+0

Muy informativo, gracias por su ayuda. – xenon

+0

Este sería uno de los casos en los que no puede alejarse de las pruebas del navegador ya que realmente no se puede probar. Sin embargo, para una solución completa, también debe manejar la función de teclado para la navegación del teclado –

+2

@Juan: algunas funciones de detección detectan un evento de burbujeo. Ver http://perfectionkills.com/detecting-event-support-without-browser-sniffing/#comment-44332 –

0

Estoy tratando de entender por qué necesita verificar dos veces el nombre de la selección después de recibir un evento.

¿Tiene usted, por casualidad, varios elementos con la misma identificación?

¿De verdad quiso decir "#container select" en lugar de "#container"?

+1

No. estoy usando delegación de eventos porque no me quiero unir el evento para cada en la página que no quiero que se active este evento. –

+0

Puede agregar una ID al elemento de selección en sí – Mottie

3

idea que podría ayudar:

$(document).ready(function() { 
    $('#container select[name="mySelectName"]').change(function(e) { 
    var s = $(e.target); 
    if (s.val()=='1') //hide/show something; 
    }); 
}); 

Si está utilizando AJAX, intente live() función:

$(document).ready(function() { 
     $('#container select[name="mySelectName"]').live('change', function(e) { 
     var s = $(e.target); 
     if (s.val()=='1') //hide/show something; 
     }); 
    }); 
+2

'jQuery/live()' no admite el evento 'change'. Ver http://docs.jquery.com/Events/live#typefn –

+0

@crescentfresh Eso es algo nuevo para mí, gracias. –

+2

1.4 admite el evento de cambio para .live, pero el evento en sí sigue siendo un desastre en IE, hasta donde yo sé. – ScottyDont

3

Si recuerdo correctamente, tendrá que llamar a la falta de definición() para tener jQuery invocar el cambio() en máquinas de IE. Pruebe algo como:

$("select[name=mySelectName]").click(function() { 
    $(this).blur(); 
}); 
+0

Desafortunadamente, esto no soluciona el problema. El evento aún no se dispara, incluso cuando el