У меня есть следующая структура:
<div class="wrapper">
<h1>Header 1</h1>
<h2>subtitle 1</h2>
<p>aaa</p>
<p>bbb</p>
<p>ccc</p>
<h2>subtitle2</h2>
<p>ddd</p>
<h1>Header 2</h1>
<h2>subtitle 3</h2>
<p>eee</p>
<p>fff</p>
</div>
Я хочу выбрать все элементы h1 и p между каждым h1 и обернуть их в div, поэтому я получаю:
<div class="wrapper">
<div>
<h1>Header 1</h1>
<h2>subtitle 1</h2>
<p>aaa</p>
<p>bbb</p>
<p>ccc</p>
<h2>subtitle2</h2>
<p>ddd</p>
</div>
<div>
<h1>Header 2</h1>
<h2>subtitle 3</h2>
<p>eee</p>
<p>fff</p>
</div>
</div>
Я пробовал разные вещи, подобные приведенным ниже, но ни одна из них не работает идеально:
$( "h1" ).prevUntil( "h1" ).wrapAll( "<div></div>" );
$("h1").each(function(){})
.prevUntil
будет инвертировать обход узла Dom, вместо этого используйте .nextUntil
.
что касается конечного вывода, сценарий выглядит следующим образом:
<script>
$("h1").each(function() {
$(this).nextUntil( "h1" ).wrapAll( "<div></div>" );
// uncomment the two lines to move the h1 inside the wrapped div
// const el = $(this).next();
// $(this).prependTo(el);
});
</script>
Спасибо, это близко, но он также оборачивает h1 внутри нового div. Я хочу, чтобы div находился под h1. есть идеи?
На самом деле, если вы удалите последние две строки (строки 'const el' и '$(this)'), все будет работать отлично! Я приму это как ответ, если вы удалите эти строки
Отредактировал ответ. Спасибо за принятый голос!🙏
Я придумал это решение, в котором он получает всех дочерних элементов, а затем, если это тег h1, он создаст новый div и переместит в него H1 и другие дочерние элементы.
var newDiv;
$(document).ready(function(){
$(".wrapper").children().each(function(){
if($(this).is("h1")){
$(this).before("<div></div>");
newDiv = $(this).prev();
newDiv.append($(this));
}else{
newDiv.append($(this));
}
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrapper">
<h1>Header 1</h1>
<h2>subtitle 1</h2>
<p>aaa</p>
<p>bbb</p>
<p>ccc</p>
<h2>subtitle2</h2>
<p>ddd</p>
<h1>Header 2</h1>
<h2>subtitle 3</h2>
<p>eee</p>
<p>fff</p>
</div>
Зачем вам использовать
prevUntil()
, когда вы пытаетесь найти элементы, следующие за элементом<h1>
(до следующего<h1>
? Я бы предложил переключить это наnextUntil()
.