60

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

如何使用 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>
4

7 回答 7

73

解决这个问题有两种特别有用的方法:.nextUntil.andSelf。第一个将抓取您的选择器之后的所有兄弟姐妹,而后者也将包含与您的选择器匹配的任何内容,为您提供一个包含所有兄弟的 jQuery 对象:

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

这导致以下结果:

在此处输入图像描述

于 2009-01-26T21:50:26.607 回答
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.
});
于 2011-11-18T07:41:40.533 回答
4
$('#secondSelector').prevAll('#firstSelector ~ *')
于 2010-04-05T17:30:19.200 回答
2

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

$(firstSelector).nextAll().not(secondSelector).not($(secondSelector).nextAll()).text()
于 2009-01-27T00:03:42.577 回答
2

我觉得自从 jQuery 1.8 及更高版本发布以来,接受的答案似乎需要一些更新。.andSelf()已被弃用。取而代之的是.addBack(). 该文档解释了您需要了解的所有内容。

于 2016-10-27T14:14:31.870 回答
1

也许,与

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

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

于 2009-01-26T20:22:08.423 回答
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");
于 2009-01-26T20:30:15.567 回答