2010-07-16 4 views
2

J'ai un problème avec mon sélecteur jQuery. Voir ci-dessous les résultats du débogueur de Firebug:Problème de sélecteur jQuery gt (0)

$("#tblComponentData tr:not([disabled=disabled])").length   9 
$("#tblComponentData tr:not([disabled=disabled]):gt(0)").length 5 

Comme vous pouvez le voir il y a seulement 1 différence entre ces sélecteurs: le second sélecteur a « gt (0) ». Mais le nombre d'éléments du second sélecteur est de 5, mais le premier est de 9.

Si j'utilise IE, j'ai des résultats valides (le second sélecteur donne 8 éléments). Donc, je ne peux pas comprendre pourquoi c'est possible. J'utilise jquery-1.3.2 Pourriez-vous s'il vous plaît essayer de m'aider avec ça?

Mon balisage HTML est assez simple. Voir un exemple du tableau ci-dessous:

<table id="tblComponentData" class="componentConfigurationTable"> 
<tr style="cursor: auto; background-color: #ffffff; color: #000000"> 
    <td style="width: 20%"> 
     <b>First column</b> 
    </td> 
    <td style="width: 15%"> 
     <b>Second Column</b> 
    </td> 
    <td style="width: 30%"> 
     <b>Third Column</b> 
    </td> 
    <td style="width: 350px"> 
     <b>Fourth Column</b> 
    </td> 
</tr> 
<tr id='665' class='even' 
    type='dropdown' order='2' >  
    <td>First value</td> 
    <td>Second value</td> 
    <td>Third value</td> 
    <td style="width: 350px"> 
     <span class="special"> 
      </span>&nbsp<span class="error">Test warning</span></td> 
</tr> 
    etc........ 

Certaines lignes de la table sont désactivées (marquées par attribut [désactivé = désactivé]). Le but de mon sélecteur est de lier le gestionnaire de clic sur les éléments qui ne sont pas désactivés.

Les lignes peuvent être activées dynamiquement par javascript. Par conséquent, je dois dissocier le gestionnaire de clic de toutes les lignes de la table, puis utiliser à nouveau mon sélecteur et mon gestionnaire de liaison. Donc, mon sélecteur fonctionne plusieurs fois. La première fois, elle sélectionne les lignes correctes, mais la troisième sélectionne uniquement les éléments qui ont été sélectionnés auparavant. Ce comportement ressemble à jQuery caches selector, mais pour autant que je sache, il ne le fait jamais.

En outre, ce problème se produit dans tous les navigateurs sauf IE (je l'ai testé sur Firefox, Chrome, Safari et Opera)

Enfin, je résolu ce problème en ajoutant la classe « componentDataHeader » à la première ligne de la table et puis utilisé le sélecteur suivant:

$("#tblComponentData tr:not([disabled=disabled]):not(.componentDataHeader)") 

Cela fonctionne correctement dans tous les navigateurs. Mais c'est une chose assez intéressante pourquoi gt (0) n'a pas fonctionné.

Merci, Egor

+0

Pouvez-vous montrer (ou lien vers) le balisage? – James

+0

Êtes-vous sûr que votre balisage est valide? –

+0

Je suis sûr que le balisage est valide pour IE (cet écran fonctionne sous IE pendant plusieurs mois). Maintenant je l'ajuste pour travailler avec d'autres navigateurs principaux – Egor4eg

Répondre

0

Avez-vous essayé enchaînant avec .gt(0) - cela devrait être le même que ...

+0

Voulez-vous dire $ (" # tblComponentData tr: non ([disabled = désactivé]) "). gt (0)? Il n'y a pas de fonction gt() dans jQuery-1.3.2 – Egor4eg

0

Je ne pense pas que ce soit une question jQuery mais DOM un. Le DOM dans IE semble être différent de celui de FireFox, c'est pourquoi il montre un mauvais résultat. Avez-vous essayé de vérifier votre code HTML?

+0

Mais il dit que le premier sélecteur renvoie 9 et le second 5, dans un navigateur. – MDCore

0

Essayez

$("#tblComponentData tr:not([disabled=disabled])").filter(":gt(0)").length 

Vous devez appliquer filter