Во-первых - вы передаёте в функцию строку и используете её в качестве селектора. Как быть с элементами, которые селектору не соответствуют? Они не будут найдены. Пусть функция сразу получает узел DOM-дерева.
Во-вторых - вы обходите
childNodes
, который представляет собой динамический
NodeList
и одновременно пытаетесь его модифицировать. Удаляя один узел, вы пропускаете следующий - т.е., если несколько текстовых узлов идут подряд, то удалён будет только каждый второй; а те нетекстовые узлы, которые расположены после текстовых, тут никакой рекурсии не случится, их содержимое вообще никак не будет обработано. Надо делать копию
childNodes
, и перебирать её. Или вместо
for...of
использовать цикл со счётчиком, при удалении узла счётчик увеличиваться не должен. Или перебирать
childNodes
от конца к началу - тоже цикл со счётчиком или
reduceRight
(да, это будет использование метода не совсем по назначению).
В-третьих - какой-то бред с
nextElementSibling
, не знаю, как это комментировать. Надо было просто вызвать функцию, передав ей текущий элемент.
В четвёртых:
const deleteTextNodes = node =>
node.nodeType === Node.TEXT_NODE
? node.remove()
: [...node.childNodes].forEach(deleteTextNodes);
// или
function deleteTextNodes(node) {
if (node instanceof Text) {
node.remove();
} else {
Array.prototype.reduceRight.call(node.childNodes, (_, n) => deleteTextNodes(n), null);
}
}