Ответ 1
Если вы застряли в этой структуре, вы ищете nextUntil
, который добавляет следующие элементы до (и не включая ) элемент, соответствующий селектору, который вы его передаете:
var n = 2;
$("p:contains(Page " + n + ")").nextUntil("p:contains(Page " + (n + 1) + ")").css('background-color', 'red');
(Пример в прямом примере ниже.)
Это выбирает только абзацы после абзаца "Страница n", а не сам "Page n". Если вы также хотите включить абзац "Страница n", используйте addBack
(ранее andSelf
, но andSelf
устарел в пользу addBack
в v1.8), например:
var n = 2;
$("p:contains(Page " + n + ")")
.nextUntil("p:contains(Page " + (n + 1) + ")")
.addBack()
.css('background-color', 'red');
Но если вы можете изменить структуру, я бы, вероятно, поместил содержимое каждой страницы в элемент оболочки, например section
<section data-page="1">
<h1>Page 1</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</section>
<section data-page="2">
<h1>Page 2</h1>
<p>First line.</p>
<p>Some text here.</p>
<p>Some other text here.</p>
</section>
<section data-page="3">
<h1>Page 3</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</section>
Обратите внимание, что я также включил атрибут data-*
, идентифицирующий страницу (также изменил абзацы, содержащие номера страниц, на h1
; спецификация рекомендует включать элемент h1
- h6
для идентификации раздела). Тогда это будет просто:
$("section[data-page=" + n + "] > p").css(/*...*/);
Пример в реальном времени с использованием текущей структуры (без addBack
):
var colors = {
1: "red",
2: "green",
3: "blue"
};
var n;
for (n = 1; n <= 3; ++n) {
$("p:contains(Page " + n + ")").nextUntil("p:contains(Page " + (n + 1) + ")").css('background-color', colors[n]);
}
<p>Page 1</p>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
<p>Page 2</p>
<p>First line.</p>
<p>Some text here.</p>
<p>Some other text here.</p>
<p>Page 3</p>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>