2010-01-16 3 views
6

Y at-il un bogue dans la façon dont jQuery gère les sélecteurs enfants ou est-ce que je rate quelque chose d'évident? Je ne peux pas le faire fonctionner quand l'enfant est autre que *.Est-ce un bug dans la façon dont jQuery traite les sélecteurs enfants?

Voici le sélecteur jQuery je courais:

$("#myTable > tr").each(function() { 
    // do somthing } 
); 

Et la structure de la table est:

<table id="myTable"> 
    <tr> 
     <td><button>someButton</button></td> 
     <td><textarea>...</textarea></td> 
    </tr> 
</table> 

Aucun élément ne correspondent au dessus de #myTable > tr. Mais les deux sélecteurs énumérés ci-dessous fonctionnent bien.

$("#myTable tr") // search all descendants for tr 

ou utiliser un caractère générique pour correspondre les enfants:

$("#myTable > *") // search all child elements 

Toutes les idées sur ce qui pourrait être mal ici?

Merci pour les réponses rapides les gars! Malheureusement, ne peut en sélectionner un.

Répondre

10

C'est parce que Firefox ajoute automatiquement tbody éléments autour de vos éléments tr si aucun n'est fourni. Vous ne pouvez vraiment pas utiliser table > tr.

Vous avez:

<table id="myTable"> 
    <tr> 
     <td><button>someButton</button></td> 
     <td><textarea>...</textarea></td> 
    </tr> 
</table> 

Mais Firefox Sées ceci:

<table id="myTable"> 
    <tbody> 
    <tr> 
     <td><button>someButton</button></td> 
     <td><textarea>...</textarea></td> 
    </tr> 
    </tbody> 
</table> 

D'autres éléments fonctionnent très bien:

<div> 
    <strong>Hi</strong> 
</div> 

Et le sélecteur:

alert($("div > strong").text()); // Alerts "Hi" 
5

Il y a un élément <tbody> implicite ajouté signifiant au lieu de:

<table id="myTable"> 
    <tr> 
    <td><button>someButton</button></td> 
    <td><textarea>...</textarea></td> 
    </tr> 
</table> 

DOM contient en fait:

<table id="myTable"> 
<tbody> 
    <tr> 
    <td><button>someButton</button></td> 
    <td><textarea>...</textarea></td> 
    </tr> 
</tbody> 
</table> 

changer de façon à:

$("#mytable > tbody > tr"); 

En utilisant <tbody>, <thead> et <tfoot> éléments dans vos tableaux est une bonne habitude à prendre.

1

oui, Doug a complètement raison. Juste pour compléter sa réponse, peut-être vous êtes au courant, ou peut-être pas, mais rappelez-vous que jQuery traverse le DOM, et pas le "texte" HTML que vous envoyez au navigateur.

Le DOM est l'interprétation du navigateur sur le code HTML que vous lui envoyez.

+0

Merci Andy. Je n'étais pas au courant que les navigateurs ajoutent implicitement l'élément 'tbody'. En fait, j'utilise toujours l'inspecteur DOM lors du débogage de telles erreurs, et l'élément 'tbody' a été renseigné là tout le temps, mais de toute façon je ne l'ai pas vu :) – Anurag