Node
Поскольку существует необходимость ссылаться на элементы и текст в DOM, мы будем использовать
Node interface .При использовании интерфейса Node важно помнить, что узел - это элемент, текст, комментарии, документ или даже пробел.Пробел - это то, что делает обход DOM путем ссылки на узлы настолько трудным.Демонстрация ниже показывает нам способ использования списков узлов, отфильтровывает нужные элементы по условиям и правильно обрабатывает textNodes и пробелы.
Ниже приведен список свойств и методов, используемых в демонстрации:
querySelectorAll ()
parentNode
nextSibling
nodeType
removeChild
textContent
test ()
Демо
Подробности прокомментированы в демоверсии
// Collect all .elements in a NodeList
var elements = document.querySelectorAll('.element');
/* for each .element...
|| Collect all of .element's <br>
*/
for (let i = 0; i < elements.length; i++) {
var brs = elements[i].querySelectorAll('br');
// for each <br> in the current .element...
for (let j = 0; j < brs.length; j++) {
// Find current <br>'s parent
var parent = brs[j].parentNode;
// Check what type of node is next after current <br>
var textCheck = brs[j].nextSibling.nodeType;
// if the next node is NOT a nodeType TEXT (3)...
if (textCheck !== 3) {
//... Remove the current <br>...
parent.removeChild(brs[j]);
} else {
/* ...but if the next node is a textNode,
|| use wsCheck function to see if it is only whitespace...
*/
if (wsCheck(brs[j].nextSibling)) {
//...if it is only whitespace then remove current <br>...
parent.removeChild(brs[j]);
/*...otherwise if it is a textNode with text
|| remove current <br>
|| break out of the inner for loop and continue to the
|| outer for loop
*/
} else {
parent.removeChild(brs[j]);
break;
}
}
}
}
function wsCheck(node) {
return !(/[^\t\n\r ]/.test(node.textContent));
}
<div class="element">
<br>
<span>
<br>
<span>
<br>
text node one
<br>
</span>
<br>
</span>
</div>
<div class="element">
<br>
<span>
<br>
<br>
text node two
</span>
</div>