Оберните все элементы после заголовка до следующего заголовка, который такой же или выше
Что я имею:
У меня есть контент, состоящий из заголовков (h1, h2, h3, h4, h5, h6).
Что мне нужно:
Используя jQuery, мне нужно обернуть все элементы, следующие за каждым заголовком, до следующего того же заголовка или более высокого заголовка. Под "высшим" я имею в виду:
- h5 "выше" чем h6.
- h4 "выше", чем h5 и h6.
- h3 "выше", чем h4, h5 и h6.
... и так далее, и тому подобное.
Например, обернуть все элементы после h3 до следующего заголовка h3 или выше (h1 или h2).
Вот пример желаемого конечного результата:
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: Arial;
color: white;
background-color: black;
margin: 0;
padding: 5px;
}
.h1-section,
.h2-section,
.h3-section,
.h4-section,
.h5-section,
.h6-section {
border: 1px solid black;
border-top: none;
padding: 20px;
}
<h1>1</h1>
<section class="h1-section">
<h2>2</h2>
<section class="h2-section">
<h3>3</h3>
<section class="h3-section">
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
</section>
</section>
</section>
<h1>1</h1>
<section class="h1-section">
<h2>2</h2>
<section class="h2-section">
<h3>3</h3>
<section class="h3-section">
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
</section>
<h3>3</h3>
<section class="h3-section">
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
</section>
</section>
<h2>2</h2>
<section class="h2-section">
<h3>3</h3>
<section class="h3-section">
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
</section>
<h3>3</h3>
<section class="h3-section">
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
</section>
</section>
</section>
Что я пробовал:
Используя jQuery, я попытался использовать.nextUntil(), но я неправильно выбираю и упаковываю элементы:
$(document).ready(function() {
$("h1").nextUntil("h1").wrapAll("<section class='h1-section'></section>");
$( "h2" ).nextUntil("h1, h2").wrapAll( "<section class='h2-section'></section>");
$( "h3" ).nextUntil("h1, h2, h3").wrapAll( "<section class='h3-section'></section>");
$( "h4" ).nextUntil("h1, h2, h3, h4").wrapAll( "<section class='h4-section'></section>");
$( "h5" ).nextUntil("h1, h2, h3, h4, h5").wrapAll( "<section class='h5-section'></section>");
$( "h6" ).nextUntil("h1, h2, h3, h4, h5, h6").wrapAll( "<section class='h6-section'></section>");
});
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: Arial;
color: white;
background-color: black;
margin: 0;
padding: 5px;
}
.h1-section,
.h2-section,
.h3-section,
.h4-section,
.h5-section,
.h6-section {
border: 1px solid black;
border-top: none;
padding: 20px;
}
<h1>1</h1>
<h2>2</h2>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h1>1</h1>
<h2>2</h2>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h2>2</h2>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
Мой вопрос:
Как мне достичь желаемого результата с помощью jQuery?
1 ответ
Проблема в том, что что-то вроде:
$("h5").nextUntil("h5")
вернет все nextUntils, а не только для каждого h5
что вы ожидаете. то есть он получит nextUntils для первого h5 и объединит их с nextUntils второго h5 и т. д. Затем, когда вы примените wrapAll, он обернет все их, а не только отдельные наборы.
Пример использования .text()
чтобы показать это
console.log($("h5").nextUntil("h5").length, $("h5").nextUntil("h5").text())
h5,h6 { margin:0; padding:0; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h5></h5><h6>1</h6><h6>2</h6>
<h5></h5><h6>3</h6><h6>4</h6>
Так что нужно смотреть на каждого h5
один за раз
$("h5").each(function() {
console.log($(this).nextUntil("h5").length, $(this).nextUntil("h5").text())
});
h5,h6 { margin:0; padding:0; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h5></h5><h6>1</h6><h6>2</h6>
<h5></h5><h6>3</h6><h6>4</h6>
Тогда вы можете заменить .length
/ .text()
с вашим .wrapAll()
:
$("h5").each(function() {
$(this).nextUntil("h5").wrapAll("<div class='section-h5'>")
});
$("h6").each(function() {
$(this).nextUntil("h6,h5").wrapAll("<div class='section-h6'>")
});
h5,h6 { margin:0; padding:5px; }
h5 { margin-top:4px; }
h6 { }
.section-h5 { padding: 5px; border:1px solid blue; }
.section-h6 { padding: 5px; border:1px solid green; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h5></h5><h6></h6><div>1</div><h6></h6><div>2</div>
<h5></h5><h6></h6><div>3</div><h6></h6><div>4</div>
(распространяется на другие уровни H по мере необходимости)