52 votes

Comment enchaîner ce code ?

J'ai ce code :

$("#test").siblings('p').remove();
$("#test").remove();

Comment puis-je enchaîner ce code au lieu de l'écrire séparément ?

83voto

Eli Points 11213

Vous voulez utiliser addBack() dans ce cas :

$("#test").siblings('p').addBack().remove();

EDIT

Tout d'abord, pour les futurs visiteurs, si vous utilisez jQuery version 1.8-, vous devez probablement utiliser etSelf() qui est le prédécesseur de addBack() pour les problèmes de compatibilité.

Deuxièmement, les deux end y addBack effectueront la même tâche dans ce cas, mais il s'agit en fait d'une perspective différente. Jetez un coup d'oeil à ce HTML :

<div class="grandpa">
    <div class="dad">
        <div class="son">
            Test
        </div>
    </div>
</div>

Si nous utilisons end() :

$('.grandpa')
    .find('.dad')
        .find('.son')
        .addClass('youngster')
        .end()
    .addClass('adult')
    .end()
.addClass('oldster');

Le résultat ressemblera à ceci :

<div class="grandpa oldster">
    <div class="dad adult">
        <div class="son youngster">
            Test
        </div>
    </div>
</div>  

Ainsi, lorsque nous utilisons end() para son nous disons à jQuery qu'il doit revenir en arrière à partir de son à l'ensemble des parents qui est dad et ajouter la classe adult .

Mais lorsque nous utilisons addBack :

$('.grandpa')
    .find('.dad')
        .find('.son')
        .addClass('youngster')
        .addBack()
        .addClass('adult')
        .addBack() // This simply do nothing since `addBack` is not traverse up DOM element 
        .addClass('oldster');    

ce qui aboutira à ceci :

<div class="grandpa">
    <div class="dad adult oldster">
        <div class="son youngster adult oldster">
            Test
        </div>
    </div>
</div>

Donc quand on appelle addBack en son nous disons à jQuery de pousser dad y son dans la même pièce et ajouter une nouvelle classe adult y oldster à tous les deux.

16voto

Jai Points 23908

El end() est surtout utile pour exploiter les propriétés de chaînage de jQuery. Lorsque l'on n'utilise pas le chaînage, on peut généralement se contenter d'appeler une méthode précédente object par nom de variable, donc nous n'avons pas besoin de manipuler la pile.

Le nouvel ensemble d'éléments est poussé sur une pile qui est maintenue à l'intérieur de la fonction object . Chaque méthode de filtrage successive pousse un nouvel ensemble d'éléments sur la pile. Si nous avons besoin d'un ensemble d'éléments plus ancien, nous pouvons utiliser la méthode suivante end() pour retirer les jeux de la pile.

Je suppose qu'avec l'utilisation de .end() comme ça :

$("#test").siblings('p').remove().end().remove();

Vous pouvez trouver un violon


Une explication :

Maintenant, que se passe-t-il avec le code ci-dessus :

Supposons que ce balisage HTML :

<div id='container'>
   <div id='test'>This is supposed to be removed.</div>
   <p>And this to be removed too.</p>
</div>

lorsque script s'exécute :

$("#test").siblings('p').remove()

ce bloc supprime l'élément frère <p> de la vue, alors le balisage sera mis à jour comme suit :

<div id='container'>
   <div id='test'>This is supposed to be removed.</div>
</div>

et si nous l'enchaînons avec .end()

$("#test").siblings('p').remove().end()

il retourne à la pile à #test puis la partie suivante du script est lancée.

$("#test").siblings('p').remove().end().remove();
                             //--^^^^^^^^^^^^^^^----this next part

et #test est supprimé de la vue et votre sortie finale de balisage sera comme :

<div id='container'>
</div>

10voto

vladimir77 Points 1216

Peut être hors sujet vous pouvez changer la vision du problème :

$("#test, #test ~ p").remove(); // !! incorrect way, see comment below

Les gars, désolé :( ma décision n'est pas correcte ! !!

Sélecteur ' ~ n'est pas égal à frère et sœur '-méthode. ' ~ ' sélectionne tous les frères et soeurs ' p Les éléments qui suivent APRÈS le #test élément ".

Donc je suggère une autre décision :

$("#test, > p", $('#test').parent()).remove();

Ce n'est pas assez élégant mais c'est le moyen le plus rapide. Veuillez le vérifier. http://jsperf.com/how-to-chain-this-code-stackoverflow-16009101 '

Résultat du test de performance :

Performance test result

PS http://jsfiddle.net/Dpe59/

7voto

Izkata Points 3634

Je dois être d'accord avec le commentaire sur la question ; pour la lisibilité et la maintenabilité, utiliser andSelf :

$("#test").siblings('p').andSelf().remove();

Malheureusement, il a été déprécié. Mais si vous êtes coincé sur une version plus ancienne de jquery comme nous, il mai être utile.

1voto

user2153497 Points 156
$("#text").siblings('p').remove().prevObject.remove();

éditer : Bien que cela fonctionne, ne le faites pas, comme le dit le commentaire de Matt, prevObject est sans document

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