6
votes

Sélecteur de filtrage JQuery pour éliminer le motif de correspondance des éléments imbriqués

Compte tenu de ce balisage d'échantillon (en supposant un nombre aléatoire d'éléments entre .outer code> et .inner code>: xxx pré>

i peut configurer jQuery à sélectionner les divs externes et internes comme tels: p> xxx pré>

fonctionne bien. P>

Cependant, disons que je veux permettre une nidification illimitée de cette logique , donc je peux avoir ceci: p> xxx pré>

dans cette situation, lors de la sélection de div A via .outer code> je veux correspondre à celui de div b. Dans d'autres mots, je veux exclure les ancêtres d'un p> p>

J'aimerais avoir des rayons de l'extérieur et des internes contenus dans leur niveau de nidification.

J'espère .filter () code> pourrait le retirer, mais je ne peux pas penser à un sélecteur qui fonctionnerait universellement pour des motifs imbriqués illimités. Est-ce que c'est faisable à l'aide d'un filtre? Ou peut-être même un sélecteur direct? P>

Mise à jour: p>

Je pense que quelque chose comme ça pourrait fonctionner, mais pas sûr de la manière dont on peut (ou si c'est permis) de référence 'this' Sélecteur: P>

var $outer = $('.outer');
var $inner = $outer.find('.inner').filter(function(){
    $(this).each(function(){
        return $(this).closest('.outer') == $outer; 
  });                                                                  
});


1 commentaires

Cela n'a pas de sens - même si vous faites correspondre le premier nid et que vous ne supprimez que - ses enfants seraient enlevés de toute façon


6 Réponses :


2
votes
$('.outer').children('.inner');
That would select any inner that sits immediately below an outer. I'm not really clear on which div you're trying to select for. Is it a, b, c, or d? Having something called outer nested within something called inner doesn't make a whole lot of sense. Maybe if you could provide a more specific example?

2 commentaires

+1 - Ceci est probablement le meilleur pari en supposant que le .inner est toujours un enfant direct du .outer et non imbriqué un autre niveau en bas ...


Désolé de ne pas clarifier cela. C'est en effet une variable. Intérieur sera un descendant, mais pas nécessairement un enfant immédiat.



1
votes

Vous pouvez utiliser une magie CSS:

$('.outer>.inner')


1 commentaires

Ce sélecteur correspondra à la fois .inner



2
votes

Si le .inner sont toujours directs enfants de .outer s - Enfants () est probablement votre meilleur choix (réponse de JasongetsDown)

Si vous avez besoin de quelque chose qui semble encore plus profond, vous pouvez faire quelque chose comme ceci: xxx

Jsfiddle Demo


2 commentaires

@gnarf ... Je pense que c'est proche de ce que je pensais aussi. J'ai ajouté une mise à jour de mon message qui utilise également une fonction de filtrage. Le mien ne fonctionne pas, je vais essayer votre syntaxe Suivant!


Au fait, +1 une heure d'heure, nice. Je suis sûr que vous êtes correct, cela semble être la bonne logique.



1
votes

Si vous supposez correctement, vous voulez sélectionner tous les .inner qui est sous un .ouvert , sauf s'il y a un .outer inbetween, Peut-être que le suivi fonctionnera (non testé): xxx

mis à jour après le test sur OP Exemple HTML à http://jsfiddle.net/cewbt/1/


1 commentaires

Votre hypothèse est correcte. Cependant, cet échantillon ne fonctionnera pas. Je me cache d'abord "extérieur", puis veut trouver tous les notes qui ne sont pas un enfant d'un extérieur imbriqué. La capture est que mon extérieur caché est un .outer alors serait donc excluant lui-même.



12
votes

Voici une autre option. Supposons que vous ayez le .outer code> o code>, cela sélectionnera tout interne code> S sous IT:

o.find('.inner').not(o.find('.outer .inner'))


7 commentaires

Brillant! Comme d'habitude, la réponse est plus simple que le chemin que je finis à descendre. Je me débattais avec la syntaxe nécessaire pour combiner un objet mis en cache avec un sélecteur CSS et la logique de recherche () ne me survient pas. Merci!


Merci! Au fait, la question est très intéressante et stimulante, il a fallu beaucoup de travail pour se rendre à cette ligne simple ...


Belle optimisation, souhaite que j'y pensais d'abord :) - était de jouer avec l'utilité de . non () hier pour cette réponse .


Pourquoi avez-vous besoin de trouver des expositions au début? Pourquoi ne pas regarder juste à l'étranger et ensuite obtenir le plus proche extérieur? Voir mon commentaire aussi


Hé, cette question me qualifie pour l'argent jQuery badge!


Il trouve juste votre réponse à être génial que =)


@Kobi - Grats - Je suis assis jolie fermer moi-même - comme on le voit sur Odata :)



0
votes

Je me demande pourquoi ne pas sélectionner .inner code> au début, puis obtenir le plus proche code> .outer code>?

$inner = $('.inner');
$outer = $inner.closest('.outer');


2 commentaires

La question ici est dans l'autre sens. Donné un extérieur , comment trouvez-vous son interne divs?


voir. Ma question est pourquoi ne pas aller d'autre direction. Avoir donné le .ouvert, la réponse de Kobi fonctionne parfaitement. Mais si vous avez juste besoin d'obtenir tous les Inners pour tous les expositions - que vous puissiez commencer à partir de zéro pour dire