【发布时间】:2012-06-06 08:30:16
【问题描述】:
在不涉及太多细节的情况下,我正在使用 javascript 清理表格内的空白。我需要删除大量的文本节点。当涉及到 IE9 时,这似乎是我脚本中的瓶颈。
以下所有方法都可以完成这项工作,但它们会导致严重的减速。
domNode.removeNode(true);
domNode.nodeValue = "";
domNode.parentNode.removeChild(domNode);
有没有办法进行批量删除或将它们隐藏在 dom 等中。只是更快。
我也在 textnodes 上试过这个:
domNode.innerHTML = '';
虽然它执行得很快,但文本节点似乎没有被它分阶段。
另外,我需要保留事件绑定,因此在整个表上替换 .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 = '';
【问题讨论】:
-
我会对细节感兴趣。为什么需要从表格中删除空白文本节点,它们不会影响显示?
-
他们在 IE9 中做。有关这些详细信息,请参阅此问题。 stackoverflow.com/questions/9895095/… 至于为什么我不能在服务器端修复它,那就是另一个长篇故事了......
-
您是否尝试过使用 domNode.innerText = '' 或 domNode.textContent = '' 删除文本节点?
-
还在为这个而苦恼吗?我得说你坚持让它发挥作用。
-
请记住,选项 B
[...].nodeValue = "";实际上并没有删除节点。这就是它更快的原因。
标签: javascript dom