55 votes

événement jQuery changer sur <select> ne pas tirer dans IE

J'ai une page avec un nombre variable d'éléments <select> (ce qui explique pourquoi j'utilise la délégation d'événements ici). Lorsque l'utilisateur modifie l'option sélectionnée, je souhaite masquer / afficher différentes zones de contenu sur la page. Voici le code que j'ai:

 $(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.
    }
  });
});
 

Cela fonctionne dans Firefox et Safari, mais dans IE, l'événement de changement ne se déclenche pas. Quelqu'un sait pourquoi? Merci!

72voto

Crescent Fresh Points 54070

L' change événement n'a pas de bulle dans IE (Voir ici et ici). Vous ne pouvez pas utiliser l'événement de délégation en tandem avec elle.

En fait, c'est à cause de ce IE bug jQuery live a officiellement exclure change à partir de la liste des événements pris en charge (pour information, le DOM spec unis change devrait bulle).[1]

Quant à votre question, vous pouvez lier directement à chaque sélectionnez:

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

Si vous voulez vraiment de l'événement de la délégation que vous pourriez trouver un certain succès en essayant ce que cette personne n'avait et lier click dans IE uniquement, qui ne bulle:

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

Mais cette détection du navigateur se sent vraiment mal. J'aimerais vraiment essayer de travailler avec l'ancien exemple (qui lie directement à la baisse à la baisse). Sauf si vous avez des centaines de <select> boîtes, événement délégation ne serait pas vous acheter beaucoup ici de toute façon.


[1] Note: jQuery >= 1.4 simule un bouillonnement change événement dans IE via live()/on().

3voto

Arnis L. Points 18316

Idée qui pourrait aider:

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

Si vous utilisez AJAX, essayez la fonction live () :

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

3voto

Daniel Sloof Points 6161

Si je me souviens bien, vous devrez appeler blur () pour que jQuery invoque change () sur les ordinateurs IE. Essayez quelque chose comme:

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

3voto

user406905 Points 1004

utiliser jQuery 1.4.4 (et je pense que 1.4.3) semble être tout bon maintenant .... l'événement de changement fonctionne de manière cohérente dans mes tests limités.

1voto

Soheil Points 11

Ajoutez ces lignes à votre tête de page, asseyez-vous et détendez-vous! :)

 $(document).ready(function(){$('select').bind('onChange',function(){$(this).blur()});});
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X