При правильном использовании DOM это немного сложнее, но не о чем беспокоиться, так как это очень просто.
Вы хотите разделить текст, поэтому имеет смысл работать только с текстомузлы.Чтобы найти все текстовые узлы, мы могли бы оценить XPath или построить TreeWalker
.
Как только мы узнаем, над какими узлами мы хотим работать, мы берем один узел за раз и получаем все пространствои последовательности без пробелов.Каждый будет преобразован в другой текстовый узел, но последовательности без пробелов будут дополнительно заключены в <span>
.Мы добавляем их один за другим перед исходным узлом, что гарантирует правильный порядок, а затем, наконец, удалим исходный узел, когда все замещающие узлы будут на своем месте.
function getTextNodes(node) {
let walker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false);
let textnodes = [];
let textnode;
while (textnode = walker.nextNode()) {
textnodes.push(textnode);
}
return textnodes;
}
function wrap(element) {
getTextNodes(element).forEach(node => {
node.textContent.replace(/(\S+)|(\s+)/g, (match, word, space) => {
let textnode = document.createTextNode(match);
let newnode;
if (word) {
newnode = document.createElement('trans');
newnode.appendChild(textnode);
} else {
newnode = textnode;
}
node.parentNode.insertBefore(newnode, node);
});
node.remove();
});
}
wrap(document.getElementById('wrapthis'));
trans {
background-color: pink;
}
Not affected<br/>
<div id="wrapthis">
This is affected<br>
<span class="gras">HTML tags are fine</span><br/>
This as well<br/>
</div>
Not affected<br/>