Как выбрать все содержимое между двумя тегами в jQuery
У меня есть документ с заголовками и ненумерованные списки.
Как я могу использовать JQuery для выбора заданного заголовка (по его уникальному имени класса) и всего содержимого между этим заголовком и следующим заголовком?
обновление:
ваши предложения велики, но это не то, что я ищу. В приведенном ниже коде, например, я хотел бы получить доступ только к" h1 "с идентификатором" heading2 "и все до, но не включая" h1 " с идентификатором "заголовок3".
примеры jQuery, приведенные выше, получат доступ ко всем после первого тега "h", который не является тегом" h".
... или, поправьте меня, если я ошибаюсь :)
<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>
7 ответов:
два метода, в частности, было бы очень полезно решить эту проблему:
.nextUntil
и.andSelf
. Первый захватит всех братьев и сестер, следующих за вашим селектором, а последний будет объединять все, что соответствует вашему селектору, давая вам один объект jQuery, который включает их все:$("#heading2") .nextUntil("#heading3").andSelf() .css("background", "red");
Это приводит к следующему:
вот решение, которое я использую для моих проектов:
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);
использование
$('body').between($('#someid'), $('#someid2')).each(function () { // Do what you want. });
Да, ты прав. Это позволит избежать только нужный селектор. Может быть, это должно быть более подробно:
$(firstSelector).nextAll().not(secondSelector).not($(secondSelector).nextAll()).text()
может, с
$(selectorForFirstHeading).nextAll().not(selectorForLastHeading).text()
почему я использую
text()
? Потому чтоhtml()
вернет только внутренний HTML первого элемента результата.
Я чувствую, что принятый ответ нуждается в небольшом обновлении с момента выпуска jQuery 1.8 и более поздних версий.
.andSelf()
была прекращена. На его месте мы имеем.addBack()
. Элемент документация объясняет все, что нужно знать.
Если элементы находятся на одном уровне, что-то вроде этого:
<h1 id="heading1">...</h1> <ul>...</ul> <p>...</p> <ul>...</ul> <p>...</p> <h1 id="heading2" >...</h1>
то есть, ваш следующий элемент заголовка не является дочерним элементом элемента на том же уровне, как первый элемент заголовка. Вы можете попробовать этот код:
// This will get all the following siblings of <h1 id="heading1"> except those that are headings themselves var elements = $('#heading1').nextAll().not("h1");