如何在jQuery中选择两个标签之间的所有内容

时间:2009-01-26 19:47:16

标签: jquery css-selectors traversal

我有一个带有标题和无序列表的文档。

如何使用JQuery选择给定标题(按其唯一的类名称)以及该标题与下一个标题之间的所有内容?

更新

你的建议很棒,但不是我想要的。例如,在下面的代码中,我只想访问id为“heading2”的“h1”以及所有内容,但不包括id为“heading3”的“h1”。

上面提供的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 个答案:

答案 0 :(得分:71)

特别是两种方法解决此问题非常有用:.nextUntil.andSelf。第一个将抓住你的选择器之后的所有兄弟姐妹,后者将把你的选择器匹配的任何东西都混在一起,给你一个jQuery对象,包括它们:

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

这导致以下结果:

enter image description here

答案 1 :(得分:7)

以下是我用于项目的解决方案:

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

答案 2 :(得分:3)

$('#secondSelector').prevAll('#firstSelector ~ *')

答案 3 :(得分:2)

是的,你是对的。这只会避免所需的选择器。也许它需要更详细:

$(firstSelector).nextAll().not(secondSelector).not($(secondSelector).nextAll()).text()

答案 4 :(得分:1)

也许,用

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

为什么我使用text()?因为html()只会返回第一个结果元素的内部HTML

答案 5 :(得分:1)

自从jQuery 1.8及更高版本发布以来,我觉得好像接受的答案需要一些更新。 .andSelf()已被弃用。取而代之的是.addBack()documentation解释了您需要知道的一切。

答案 6 :(得分:0)

如果您的元素处于同一级别,请执行以下操作:

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