11 votes

jQuery ne renvoie que le premier élément

Pour une raison étrange, chaque fois que j'ai un sélecteur et que je m'attends à obtenir plusieurs éléments, jQuery ne renvoie que le premier élément, au lieu de toute la collection.

Voici le code HTML dont je dispose :

<a id="reply-424880" class="reply" href="#" rel="nofollow">Reply</a>
<a id="reply-424885" class="reply" href="#" rel="nofollow">Reply</a>

Et le sélecteur :

$('.reply').unbind('click').click(function(event) {
 ...
}

J'ai essayé de déboguer en utilisant FireBug, et j'obtiens toujours les mêmes résultats. En utilisant la solution de contournement, j'arrive à le faire fonctionner :

$('a').each(function (index, element) {
            if ($(element).attr('class') == 'reply') {
                $(this).unbind('click').click(function(event) {
                     ...
                });
             }
});

J'aimerais utiliser la fonctionnalité intégrée au lieu de ma solution de contournement. Savez-vous pourquoi seul le premier élément est renvoyé ?

27voto

Jon Kloske Points 851

J'ai également eu ce problème et il s'est avéré que Chrome semble avoir une fonction $() de type jquery qui implémente un sous-ensemble de la logique du sélecteur d'une manière similaire, mais il manque un certain nombre de fonctions :

> $
function $(selector, [startNode]) { [Command Line API] }

Vs avec jQuery correctement inclus :

> $
function (e,n){return new x.fn.init(e,n,t)} 

Donc ouais, il s'avère que j'ai légèrement malformé ma balise script - pas assez pour causer des erreurs, et il a quand même récupéré le fichier jQuery, donc la vue du réseau montrait quand même qu'il était récupéré, mais il n'était pas interprété comme du javascript, et donc jQuery manquait, mais suffisamment de la syntaxe fonctionnait quand même pour que ça me perturbe pendant des lustres.

J'espère que cela permettra à quelqu'un de gagner du temps.

3voto

Nick Craver Points 313913

Ce que vous avez devrait déjà fonctionner, Vous pouvez voir un exemple ici Il s'agit d'un appel simple :

$('.reply').unbind('click').click(function(event) {
  alert('hi there');
});​

Vous devez avoir quelque chose en dehors de la question qui affecte vos liens si le même gestionnaire n'est pas exécuté pour chacun d'entre eux. Si vous obtenez un attribut à partir du premier seulement, assurez-vous qu'à l'intérieur de votre fonction vous ne faites pas quelque chose comme $(".reply").attr("id") vous devriez utiliser this à l'intérieur du gestionnaire, vous obtiendrez l'attribut du premier élément correspondant.

En voici un exemple :

$('.reply').unbind('click').click(function(event) {
  alert($('.reply').attr("id")); //alerts "reply-424880" for both
});​

Il devrait se présenter comme suit :

$('.reply').unbind('click').click(function(event) {
  alert($(this).attr("id")); //alerts "reply-424880" for both
  //and use just this.id in this case, no need for jQuery .attr(), like this
  //alert(this.id);
});​

1voto

Serhiy Points 711

Après avoir laissé la solution de contournement en place pendant quelques mois, j'ai décidé d'essayer de voir s'il y avait quelque chose sur la page qui causait le problème.

Par élimination, j'ai pu réduire l'erreur au fichier jquery.validate.js. Pour une raison inconnue, ce fichier faisait que jQuery ne renvoyait que la première valeur. J'ai téléchargé la dernière version et les sélecteurs renvoient maintenant todos les éléments qui correspondent.

0voto

Gabe Points 24378

Cela devrait fonctionner, mais qu'en est-il de ...

$('.reply').each(function() { 
   $(this).unbind('click').click(function(event) {
      ... 
   });
});

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