60 votes

Existe-t-il un sélecteur/méthode jQuery pour trouver un élément parent spécifique n niveaux au-dessus ?

Considérons le HTML suivant. Si j'ai une référence JSON à l'élément <button>, comment puis-je obtenir une référence à l'élément <tr>extérieur dans les deux cas ?

<table id="my-table">
    <tr>
        <td>
            <button>Foo</button>
        </td>
        <td>
            <div>
                <button>Bar</button>
            </div>
        </td>
    </tr>
</table>

<script type="text/js">
    $('#table button').click(function(){
        //$(this).parent().parent() will work for the first row
        //$(this).parent().parent().parent() will work for the second row
        //is there a selector or some magic json one liner that will climb
        //the DOM tree until it hits a TR, or do I have to code this myself
        //each time?            
        //$(this).????
    });
</script>

Je sais que je pourrais faire un cas particulier pour chaque condition, mais je suis plus intéressé par une solution du style "quelle que soit la profondeur de votre arbre, grimpez jusqu'à ce que vous trouviez l'élément X". Quelque chose comme ça, mais plus proche de JQuery et moins verbeux.

var climb = function(node, str_rule){
    if($(node).is(str_rule)){
        return node;
    }
    else if($(node).is('body')){
        return false;
    }
    else{
        return climb(node.parentNode, str_rule);
    }
};  

Je connais la méthode parent(expr), mais d'après ce que j'ai vu, elle permet de filtrer les parents d'un niveau supérieur et de ne PAS monter dans l'arbre jusqu'à ce que vous trouviez expr (j'aimerais avoir un exemple de code prouvant que j'ai tort).

109voto

Seb Points 17238

El parents fait ce que vous voulez :

$(this).parents("tr:first");

3 votes

Absolument, merci ! C'est à ça que sert la permission "Modifier les messages des autres" ;)

1 votes

Ha, c'est drôle. Je me demandais pourquoi Visual jQuery listait parent(expr) deux fois ; il s'avère que j'ai totalement espacé le s à la fin.

0 votes

Merci Seb, je n'étais pas du tout au courant et c'est vraiment utile. C'est bien mieux qu'une pagaille de 'parent().parent()....'.

50voto

bendewey Points 25437

En outre, si vous utilisez jQuery 1.3+, vous pouvez utiliser la fonction le plus proche méthode

$(this).closest("tr");

4 votes

Je voulais juste ajouter que closest y parents sont très similaires mais présentent une légère différence. Vous pouvez lire la suite aquí . Dans l'ensemble, je pense que le closest est plus efficace pour ce scénario spécifique.

0 votes

Hmm, très facile de comprendre ce nom de fonction.

0voto

zloctb Points 531

Pas jQuery mais cette option fonctionne beaucoup mieux

node.contains( otherNode )

La méthode Node.contains() renvoie une valeur booléenne indiquant si un noeud est un descendant d'un noeud donné ou non.

https://developer.mozilla.org/en/docs/Web/API/Node/contains

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