2009-12-08 3 views
0

J'ai récemment mis à niveau une application de jQuery 1.2 à 1.3.2 - et nous avons trouvé une régression plutôt étrange.Régression de sélecteur après la mise à niveau vers jQuery 1.3.2

Pour certains html à peu près comme celui-ci (un peu simplifié)

<div id="steps"> 
    <div class="step"> 
    <span>step #1</span> 
    <div class="removeStep"> X </div> 
    </div> 
    <div class="step"> 
    <span>step #2</span> 
    <div class="removeStep"> X </div> 
    </div> 
</div> 

Nous avons attaché précédemment un événement comme si, pour toutes les étapes:

$("#steps").find(".removeStep").click(removeStepFunc) 

Under 1.2 trouverait toutes les étapes , même ceux que nous avons ajoutés dynamiquement. Sous 1.3, cela ne trouve jamais le premier pas.

Cela ne fonctionne pas non plus:

#("#steps .removeStep").click(removeStepFunc) 

Cependant, cela ne:

#("#steps).children().find(".removeStep").click(removeStepFunc) 

Je ne peux évidemment travailler autour de la question, mais il ne me fait un peu nerveux que peut-être il y a D'autres régressions similaires affectant l'application que nous avons mise à jour, ne se présenteront que dans certains cas lorsque nous aurons plus d'un élément à faire correspondre.

Également je vois cette autre question, qui je soupçonne pourrait être le même problème?

jQuery selector bug? composed selector vs. simple selector & find()

+0

Pour moi, jQuery 1.3.2 sélectionne les deux .removeStep DIVs et attache les événements aux deux (build Firefox tous les soirs). En fait, les trois sélecteurs que vous détailler ci-dessus renvoient tous deux ces éléments pour moi. Quel navigateur essayez-vous cela? Pourriez-vous éventuellement avoir plus d'un élément avec l'identifiant "steps"? –

+0

De plus - $ (". RemoveStep") retourne également le premier élément ... c'est sur FireFox 3.5.5 – Bittercoder

+0

$ ('. RemoveStep') retourne aussi les deux entrées. Vérifiez-vous avec console.log ($ ('. RemoveStep')) pour voir que les éléments sont trouvés, et que ce n'est pas quelque chose de mal avec votre gestionnaire de clic? –

Répondre

0

Essayez ce qui suit:

jQuery('#steps > .removeStep').click(removeStepFunc) 

ou

jQuery('#steps .step .removeStep').click(removeStepFunc) 
étape 1 X étape 2 X

MISE À JOUR

Qu'en est-il quelque chose comme ça? (Non testé):

jQuery('#steps .removeStep').click(function() { 
    jQuery(this).remove(jQuery(this).parent()); 
}); 
+0

Malheureusement, cela ne fonctionne pas non plus, voici les résultats des tests: $ ("# steps> .removeStep") -> 0 correspond à $ ("# steps> .step> .removeStep ") -> 1 match $ (" # étapes div "). find (". removeStep ") -> 1 match $ (" # étapes .step .removeStep ") -> 1 match $ (".step .removeStep") -> 1 correspondance $ (". step"). find (". removeStep") -> 1 correspondance $ ("# steps"). children() -> 3 correspondances $ ("#steps"). children(). find (". removeStep") -> 3 correspondances Je ne crois pas que le problème soit jQuery, d'autant plus qu'une autre bibliothèque (éventuellement ExtJS?) interfère avec jQuery's comportement normal. C'est une partie assez fondamentale de jQuery :) – Bittercoder

+0

Si vous mettez une alerte dans 'jQuery ('# steps .removeStep'). Click', et que cette alerte se déclenche, votre jQuery fonctionne correctement. Pour tester, vous pouvez supprimer ExtJS et voir si cela aide. – Steven

Questions connexes