J'ai une page avec un nombre variable de <select>
éléments (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!
L'événement change
ne se propage pas dans IE (Voir ici et ici ). Vous ne pouvez pas utiliser la délégation d'événement en tandem avec ça.
En fait, c'est à cause de ce IE que jQuery .[ 1 ]live
a dû officiellement exclure change
de la liste des événements pris en charge (Pour info la spécification DOM indique change
devrait bouillonner )
En ce qui concerne votre question, vous pouvez vous lier directement à chaque sélection:
$('#container select').change(/*...*/)
Si vous voulez vraiment une délégation d'événement, vous pourriez trouver du succès en essayant quoi cette personne l'a fait et vous lier à click
dans IE uniquement, qui fait 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 de navigateur se sent vraiment mal. J'essaierais vraiment de travailler avec l'exemple précédent (en se liant directement aux listes déroulantes). À moins que vous ayez des centaines de boîtes <select>
, La délégation de l'événement ne vous achèterait pas beaucoup ici de toute façon.
[ 1 ] Remarque: jQuery> = 1.4 simule désormais un événement change
bouillonnant dans IE via live()
/on()
.
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.
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;
});
});
Si je me souviens bien, vous devrez appeler blur () pour que jQuery invoque change () sur les machines IE. Essayez quelque chose comme:
$("select[name=mySelectName]").click(function() {
$(this).blur();
});
onchange=doAction
Fonctionnera dans IE et Firefox, mais ce n'est pas pris en charge dans Chrome.
Vous devez utiliser l'événement .change
De jQuery pour gérer cela.
Ajoutez ces lignes à votre tête de page, Asseyez-vous et détendez-vous! :)
$(document).ready(function(){$('select').bind('onChange',function(){$(this).blur()});});
J'essaie de comprendre pourquoi vous devez vérifier le nom de la sélection après avoir reçu un événement.
Avez-vous par hasard plusieurs éléments avec le même identifiant?
Vouliez-vous réellement dire "#container select" au lieu de "#container"?
Je m'appuie simplement sur l'exemple donné par "Crescent Flesh" pour une solution multiplateforme qui survivra même en chargeant ce SELECT dans #container via un appel AJAX.
$('#container').bind($.browser.msie ? 'click' : 'change', function(event) {
if ((event.type == 'click') || (event.type == 'change')) {
if (event.target.toString().indexOf('Select') != -1) {
var sWhich = $('#container SELECT').val();
handleSelectionChange(sWhich);
}
}
});
Maintenant, vous créez simplement la fonction handleSelectionChange (), en la renommant comme vous le souhaitez.
IE nécessite que l'événement de modification soit placé dans le document prêt. Cela semble lier l'événement change à l'élément associé. J'espère que ça aide.