jquery prochains frères et soeurs
-
09-09-2019 - |
Question
Je l'ai essayé d'obtenir ce problème résolu, mais je ne peux pas sembler figurer dehors sans quelques solutions de contournement graves.
si j'ai le code HTML suivant:
<ul>
<li class="parent"> headertext </li>
<li> text </li>
<li> text </li>
<li> text </li>
<li class="parent"> headertext </li>
<li> text </li>
<li> text </li>
</ul>
Maintenant, comment puis-je maintenant il suffit de sélectionner les balises <li>
suivant le premier parent (ou deuxième, pour cette question)? En fait le choix d'un <li>
avec class="parent"
et les frères et soeurs suivants jusqu'à ce qu'il atteigne une autre <li>
avec la classe parente.
Je pourrais restructurer la liste des listes imbriquées, mais je ne veux pas faire cela. Aucune suggestion?
La solution
La racine du problème est que les <li>
s vous avez classés en tant que parent ne sont vraiment pas les parents des <li>
s « ci-dessous » eux. Ils sont frères et sœurs. jQuery a beaucoup, beaucoup de fonctions qui travaillent avec les parents réels. Je vous suggère de fixer votre balisage, vraiment. Ce serait plus rapide, plus propre, plus facile à entretenir et plus sémantiquement correct que d'utiliser jQuery pour bricoler quelque chose.
Autres conseils
En fait, vous pouvez facilement le faire en utilisant nextUntil (). pas besoin d'écrire votre propre « nextUntil », car il existe déjà.
ex. -
$(".a").nextUntil(".b");
ou comme suggéré par Vincent -
$(".parent:first").nextUntil(".parent");
Je ne pense pas qu'il y ait un moyen de le faire sans utiliser chacun depuis l'un des autres sélecteurs sélectionnera également le deuxième parent et il est frères et sœurs à venir.
function getSibs( elem ) {
var sibs = [];
$(elem).nextAll().each( function() {
if (!$(this).hasClass('parent')) {
sibs.push(this);
}
else {
return false;
}
});
return $(sibs);
}
Vous devrez exécuter la boucle vous-même car jQuery ne sait pas comment arrêter sur une condition spécifique.
jQuery.fn.nextUntil = function(selector)
{
var query = jQuery([]);
while( true )
{
var next = this.next();
if( next.length == 0 || next.is(selector) )
{
return query;
}
query.add(next);
}
return query;
}
// To retrieve all LIs avec a parent
$(".parent:first").nextUntil(".parent");
Mais vous pouvez mieux utiliser une liste vraiment structurée pour votre relation parent / enfant
<ul>
<li class="parent"> <span>headertext</span>
<ul>
<li> text </li>
<li> text </li>
<li> text </li>
</ul>
</li>
<li class="parent"> <span>headertext</span>
<ul>
<li> text </li>
<li> text </li>
</ul>
</li>
</ul>
$("li.parent ~ li");
Je sais que c'est un fil très ancien, mais Jquery 1.4 a une méthode appelée nextUntil, ce qui pourrait être utile à cet effet: http://api.jquery.com/nextUntil/
<html>
<head>
<script type="text/javascript">
$(document).ready(function() {
$("a").click(function() {
var fred = $("li").not('.parent').text();
$('#result').text(fred);
});
});
</script>
</head>
<body>
<a href="#">Click me</a>
<ul>
<li class="parent"> headertextA </li>
<li> text1 </li>
<li> text2 </li>
<li> text3 </li>
<li class="parent"> headertextB </li>
<li> text4 </li>
<li> text5 </li>
</ul>
<div id="result"></div>
</body>
</html>