Как выделить весь контент между двумя тегами в jQuery - PullRequest
57 голосов
/ 26 января 2009

У меня есть документ с заголовками и неупорядоченными списками.

Как я могу использовать JQuery для выбора заданного заголовка (по его уникальному имени класса) И всего содержимого между этим заголовком и следующим заголовком?

Обновление:

Ваши предложения великолепны, но не то, что я ищу. В приведенном ниже коде, например, я хотел бы получить доступ только к «h1» с идентификатором «heading2» и всем до, но не включая «h1» с идентификатором «heading3».

Приведенные выше примеры 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 ]

71 голосов
/ 27 января 2009

Для решения этой проблемы было бы особенно полезно два метода: .nextUntil и .andSelf. Первый захватит всех братьев и сестер после вашего селектора, а второй объединит все, что совпадает с вашим селектором, предоставив вам один объект jQuery, который включает их все:

$("#heading2")
    .nextUntil("#heading3").andSelf()
        .css("background", "red");

Это приводит к следующему:

enter image description here

7 голосов
/ 18 ноября 2011

Вот решение, которое я использую для своих проектов:

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.
});
3 голосов
/ 05 апреля 2010
$('#secondSelector').prevAll('#firstSelector ~ *')
2 голосов
/ 27 января 2009

Да, ты прав. Это позволит избежать только желаемого селектора. Может быть, это должно быть более подробно:

$(firstSelector).nextAll().not(secondSelector).not($(secondSelector).nextAll()).text()
1 голос
/ 27 октября 2016

Мне кажется, что принятый ответ нуждается в небольшом обновлении с момента выпуска jQuery 1.8 и более поздних версий. .andSelf() устарело. На его месте имеем .addBack(). Документация объясняет все, что вам нужно знать.

1 голос
/ 26 января 2009

Может быть, с

$(selectorForFirstHeading).nextAll().not(selectorForLastHeading).text()

Почему я использую text()? Потому что html() вернет только внутренний HTML первого элемента результата.

0 голосов
/ 26 января 2009

Если ваши элементы находятся на одном уровне, что-то вроде этого:

<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");
...