jquery trouver le frère précédent le plus proche avec la classe

146

voici le html approximatif avec lequel je travaille:

<li class="par_cat"></li>
<li class="sub_cat"></li>
<li class="sub_cat"></li>
<li class="par_cat"></li> // this is the single element I need to select
<li class="sub_cat"></li>
<li class="sub_cat"></li>
<li class="sub_cat current_sub"></li> // this is where I need to start searching
<li class="par_cat"></li>
<li class="sub_cat"></li>
<li class="par_cat"></li>

J'ai besoin de traverser à partir du .current_sub, trouver le précédent le plus proche .par_catet faire des choses dessus.

.find("li.par_cat")renvoie la charge entière de .par_cat(j'en ai environ 30 sur la page). J'ai besoin de cibler le seul.

J'apprécierais vraiment tous les conseils :)

Daulex
la source
7
Wow, les chats sont vraiment partout sur Internet! Maintenant, nous avons aussi des chats communs et des sous-chats.
JD Smith

Réponses:

257

Essayer:

$('li.current_sub').prevAll("li.par_cat:first");

Testé avec votre balisage:

$('li.current_sub').prevAll("li.par_cat:first").text("woohoo");

remplira le précédent le plus proche li.par_catavec "woohoo".

karim79
la source
merci Karim. Cela fonctionnait bien aussi, mais je suppose que .prev () consommerait moins de ressources, car .prevAll obtiendrait TOUS les éléments correspondants précédents et filtrerait ensuite celui dont j'ai besoin. J'accepte la réponse d'Ed.
daulex
3
En fait, après un peu de textos, le .prev () a échoué dans quelques cas. .prevAll avec: d'abord, travaillé à chaque fois. Je vous remercie.
daulex
1
.prev () ne vérifie que l'élément immédiatement précédent. J'ai ajouté le commentaire à la réponse ci-dessous avec le jsFiddle illustrant. Après avoir regardé autour de vous, c'est la meilleure réponse car même s'il doit parcourir tous les éléments, il ne nécessite pas deux fonctions pour tout saisir puis filtrer pour le trouver.
David Hobs
8
Cela signifie-t-il que vous :firsttravaillez sur une liste d'éléments retournés qui commence le plus près de l'objet sélectionné (par opposition à de haut en bas par rapport à la page)?
NReilingh
2
Merci beaucoup pour la réponse très utile. Pouvez-vous s'il vous plaît répondre à la question @NReilingh car cela me déroute vraiment. Un :firstsélecteur CSS qui sélectionne le premier élément du DOM (par exemple div.red:firstsélectionnera le premier DIV rouge dans le DOM ) n'est-ce pas jQuery analysé le sélecteur différemment?
Accountant م
17

Essayer

$('li.current_sub').prev('.par_cat').[do stuff];

Ed James
la source
19
Attends quoi? Cela ne vérifie-t-il pas uniquement l'élément immédiatement précédent? Ainsi votre code renverrait null? - Le voici testé sur jsFiddle: jsfiddle.net/Y2TEH
David Hobs
4
@DavidHobs J'ai écrit ceci il y a deux ans .... J'utiliserais certainement prevAll () ces jours-ci.
Ed James
8
@EdWoodcock envisagez de mettre à jour votre réponse, dans ce cas.
Hugo Zink
14

L'utilisation de prevUntil () nous permettra d'obtenir un frère distant sans avoir à tout obtenir. J'avais un ensemble particulièrement long qui était trop gourmand en CPU en utilisant prevAll ().

var category = $('li.current_sub').prev('li.par_cat');
if (category.length == 0){
  category = $('li.current_sub').prevUntil('li.par_cat').last().prev();
}
category.show();

Cela obtient le premier frère précédent s'il correspond, sinon il obtient le frère précédant celui qui correspond, donc nous en sauvegardons un de plus avec prev () pour obtenir l'élément souhaité.

eprothro
la source
5

Je pense que toutes les réponses manquent de quelque chose. Je préfère utiliser quelque chose comme ça

$('li.current_sub').prevUntil("li.par_cat").prev();

Vous évite de ne pas ajouter: d'abord dans le sélecteur et est plus facile à lire et à comprendre. La méthode prevUntil () a également de meilleures performances que l'utilisation de prevAll ()

Tom McDonough
la source
0

Vous pouvez suivre ce code:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
    $(document).ready(function () {
        $(".add").on("click", function () {
            var v = $(this).closest(".division").find("input[name='roll']").val();
            alert(v);
        });
    });
</script>
<?php

for ($i = 1; $i <= 5; $i++) {
    echo'<div class = "division">'
        . '<form method="POST" action="">'
        . '<p><input type="number" name="roll" placeholder="Enter Roll"></p>'
        . '<p><input type="button" class="add" name = "submit" value = "Click"></p>'
        . '</form></div>';
}
?>

Vous pouvez vous en faire une idée.

AL MaMun
la source