Извиняюсь за плохой код .. Смешная совместимость на этом тестирует мой Vanilla JS metal:
Мне нужно обернуть каждый заголовок и его узлы (до следующего заголовка) в div. Почему функция обтекания создает вложенные div-обертки (помеченные 'section)?
Исходное состояние:
<h1></h1>
<p></p>
<p></p>
<h2></h2>
<p></p>
<p></p>
Например, желаемый результат:
<div class="section">
<h1></h1>
<p></p>
<p></p>
</div>
<div class="section">
<h2></h2>
<p></p>
<p></p>
</div>
Текущий результат:
<div class="section">
<h1></h1>
<p></p>
<p></p>
<div class="section">
<h2></h2>
<p></p>
<p></p>
</div>
</div>
Конечно, чем больше массив узлов-братьев, тем глубже вложение. Я знаю, что это что-то простое, но я не могу обернуть (каламбур) голову вокруг этого.
Вот мой код JavaScript:
// Filter for grouping like elements together
var getNextUntil = function (elem, selector, group) {
// Setup siblings array and get next sibling
var siblings = [];
var next = elem.nextElementSibling;
// Loop through all siblings
while (next) {
var isClass = next.className.split(' ').some(function (c) {
var re = new RegExp(selector);
return re.test(c);
});
// Check if grouping is set
if (group == false) {
// If the matching selector is found
if (isClass == true) break;
// Otherwise, push to array
} else {
if (isClass == false) break;
}
siblings.push(next);
// Get the next sibling
next = next.nextElementSibling;
}
return siblings;
};
var headers = document.querySelectorAll("h1, h2, h3, h4, h5, h6");
Array.prototype.forEach.call(headers, function(el, i){
el.classList.add('header');
var sibs = getNextUntil(el,'header', false);
var section = document.createElement('div');
section.className = 'section';
function wrap(el, wrapper) {
el.parentNode.insertBefore(wrapper, el);
wrapper.appendChild(el);
}
wrap(el,section);
Array.prototype.forEach.call(sibs, function(el, i){
section.appendChild(el);
})
});
Любая помощь очень ценится.