Javascript 有效地从DOM中删除textnodes

Javascript 有效地从DOM中删除textnodes,javascript,dom,Javascript,Dom,在不涉及太多细节的情况下,我正在使用javascript清理表中的空白。我需要删除大量文本节点。这似乎是我在IE9脚本中遇到的瓶颈 以下所有方法都可以完成这项工作,但它们会导致极大的速度减慢 domNode.removeNode(true); domNode.nodeValue = ""; domNode.parentNode.removeChild(domNode); 有没有一种方法可以进行大容量删除,或者在dom中隐藏它们等等。快一点 我也在textnodes上尝试过: domNode.i

在不涉及太多细节的情况下,我正在使用javascript清理表中的空白。我需要删除大量文本节点。这似乎是我在IE9脚本中遇到的瓶颈

以下所有方法都可以完成这项工作,但它们会导致极大的速度减慢

domNode.removeNode(true);
domNode.nodeValue = "";
domNode.parentNode.removeChild(domNode);
有没有一种方法可以进行大容量删除,或者在dom中隐藏它们等等。快一点

我也在textnodes上尝试过:

domNode.innerHTML = '';
虽然它执行得很快,但textnodes似乎不适合它

另外,我需要保留事件绑定,这样整个表上的.innerHTML替换看起来就不是一个选项。尽管它的运行速度确实快了5倍

更新: 建议解决方案的粗略基准:

//around 480ms
stripWhitespaceTextNodes(domNode);

//around 640ms
parent.removeChild(domNode);
stripWhitespaceTextNodes(domNode);
parent.insertBefore(domNode, nextNode);

//around 700ms
tables[i].style.visibility = 'hidden';
stripWhitespaceTextNodes(domNode);
tables[i].style.visibility = 'visible';

//around 1140ms
tables[i].style.display = 'none';
stripWhitespaceTextNodes(domNode);
tables[i].style.display = 'block';
这是在4个表上完成的,其中一个表有1500行

stripWhitespaceTextNodes()函数的关键是删除文本节点,这似乎是瓶颈,下面是我的各种尝试

domNode.parentNode.removeChild(domNode);
domNode.removeNode(true);
domNode.nodeValue = ""; // <-- CURRENTLY THIS ONE IS THE TOP RUNNER
domNode.replaceWholeText('');
domNode.deleteData(0, domNode.length);

var txtNode = document.createTextNode("");
domNode.parentNode.replaceChild(txtNode, domNode);
parent.insertBefore(domNode, nextNode);

//fast but doesn't work
domNode.innerHTML = '';
domNode.parentNode.removeChild(domNode);
domNode.removeNode(true);

domNode.nodeValue=”“;// 一种方法是克隆整个表并在“非现场”进行操作。这意味着对克隆不在DOM上的克隆执行操作。然后,用修改后的克隆替换整个表。这样,操作就不会陷入困境


这涉及到几种“克隆”DOM并为DOM之外的操作创建“容器元素”的方法。

通常的技巧是在进行大的更改之前从DOM中删除正在执行这些操作的容器,然后在完成更改后将其放回

因此,在您的情况下,这可能是:

var table = /* ...get a reference to the table...*/;
var nextNode = table.nextSibling; // May be null, that's fine
var parent = table.parentNode;
parent.removeChild(table);
/* ...clean up the text nodes... */
parent.insertBefore(table, nextNode);

即使将树从页面的DOM中分离,事件处理程序仍保持连接状态,因此,当树放回时,事件处理程序仍将在那里。

您可以尝试从文档中分离表(表DOM元素),遍历它并删除空白文本节点,然后将表插入原始位置。从理论上讲,您应该获得速度-渲染树不需要在每次传递时更新,这对于文档中的表来说是昂贵的。

我对细节感兴趣。为什么需要从表中删除空白文本节点,它们不会影响显示?它们在IE9中会这样做。有关这些详细信息,请参阅此问题。至于为什么我不能在服务器端修复它,那是另一个很长的故事…您是否尝试使用domNode.innerText=''或domNode.textContent=''删除textnodes?仍然在使用这个吗?我要说的是,你坚持不懈地让它工作。记住选项B
[…]。nodeValue=“”实际上并不删除节点。这就是为什么它更快的原因。如果您只是想防止重新绘制,那么table.style.display=“none”
就足够了。@Bergi:与其说重新绘制,不如说是重新流动。但是,是的,绝对的,OP应该试着让表格和上面一样不可显示,然后选择一个对他/她最合适的。区别在哪里?当然,当js使用css值进行计算时,可能会出现无重绘的重绘,但这两种情况都不应该发生在隐藏元素上。由于某种原因,在表上设置display none只是将执行时间增加了一倍…?@Serhiy:那么答案中建议的分离呢?我可能在DOM重画假设上跳过了枪。创建克隆的domNode并使用它不会更快。看起来IE的domNode操作工具可能就是这么慢。谢谢你的建议,这正是我所想/希望的。然而,当我运行测试时,处理从DOM中删除的表实际上要慢一些。这毫无意义,但这是我得到的结果。