J'ai un document avec des titres et des listes non ordonnées.
Comment puis-je utiliser JQuery pour sélectionner un titre donné (par son nom de classe unique) ET tout le contenu entre ce titre et le titre suivant?
Vos suggestions sont excellentes, mais ce n'est pas ce que je recherche. Dans le code ci-dessous, par exemple, je voudrais accéder uniquement au "h1" avec l'ID de "head2" et tout le reste, mais sans inclure le "h1" avec l'id de "head3".
Les exemples jQuery fournis ci-dessus accéderont à tout après la première balise "h" qui n'est pas une balise "h".
... ou corrigez-moi si je me trompe :)
<h1 id="heading1">...</h1>
<ul>...</ul>
<p>...</p>
<ul>...</ul>
<p>...</p>
<h1 id="heading2" >...</h1>
<ul>...</ul>
<p>...</p>
<ul>...</ul>
<p>...</p>
<h1 id="heading3" >...</h1>
<ul>...</ul>
<p>...</p>
<ul>...</ul>
<p>...</p>
Deux méthodes en particulier seraient très utiles pour résoudre ce problème: .nextUntil
et .andSelf
. Le premier récupérera tous les frères et sœurs suivant votre sélecteur, et le second regroupera également tout ce qui correspond à votre sélecteur, vous donnant un objet jQuery qui les inclut tous:
$("#heading2")
.nextUntil("#heading3").andSelf()
.css("background", "red");
Cela se traduit par ce qui suit:
Voici la solution que j'utilise pour mes projets:
sélecteur jQuery
(function ($) {
$.fn.between = function (Elm0, Elm1) {
var index0 = $(this).index(Elm0);
var index1 = $(this).index(Elm1);
if (index0 <= index1)
return this.slice(index0, index1 + 1);
else
return this.slice(index1, index0 + 1);
}
})(jQuery);
tilisation
$('body').between($('#someid'), $('#someid2')).each(function () {
// Do what you want.
});
Oui vous avez raison. Cela évitera seulement le sélecteur souhaité. Peut-être que cela doit être plus détaillé:
$(firstSelector).nextAll().not(secondSelector).not($(secondSelector).nextAll()).text()
Peut-être, avec
$(selectorForFirstHeading).nextAll().not(selectorForLastHeading).text()
Pourquoi dois-je utiliser text()
? Parce que html()
ne renverra que le HTML interne du premier élément de résultat.
J'ai l'impression que la réponse acceptée a besoin d'un peu de mise à jour depuis la sortie de jQuery 1.8 et versions ultérieures. .andSelf()
est obsolète. À sa place, nous avons .addBack()
. Le documentation explique tout ce que vous devez savoir.
Si vos éléments sont au même niveau, quelque chose comme ceci:
<h1 id="heading1">...</h1>
<ul>...</ul>
<p>...</p>
<ul>...</ul>
<p>...</p>
<h1 id="heading2" >...</h1>
Autrement dit, votre élément de titre suivant n'est pas un enfant d'un élément au même niveau que le premier élément de titre. Vous pouvez essayer ce code:
// This will get all the following siblings of <h1 id="heading1"> except those that are headings themselves
var elements = $('#heading1').nextAll().not("h1");