Я делаю некоторое управление TextNodes в JavaScript, и я (к сожалению), должен поддерживать IE6. Node.normalize () отказывает, и я должен работать вокруг этого. Мой первый наклон состоит в том, чтобы просто повторно реализовать его с помощью других методов DOM. Как я реализовал бы это?
Вам нужно будет рекурсивно просмотреть все дочерние узлы текущего узла. При рассмотрении узла вы должны удалить все пустые текстовые узлы и объединить любые смежные текстовые узлы.
function myNormalize( node )
for each child node of node do
if child is not text
normalize(child)
else
if child node is empty
delete
continue
else
sibling = next node
while sibling exists and sibling is a text node
if sibling is empty
delete sibling
else
combine sibling with child
get next sibling
end
end
end
end
end
на основе псевдокода tvanfosson, вот что я придумал в javascript:
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
function normalize(node) {
for (i=0; i<node.childNodes.length; i++) {
var child = node.childNodes[i];
if (child.nodeType == ELEMENT_NODE) {
normalize(child);
continue;
}
if (child.nodeType != TEXT_NODE) { continue; }
var next = child.nextSibling;
if (next == null || next.nodeType != TEXT_NODE) { continue; }
var combined_text = child.nodeValue + next.nodeValue;
new_node = node.ownerDocument.createTextNode(combined_text);
node.insertBefore(new_node, child);
node.removeChild(child);
node.removeChild(next);
i -= 1;
}
}