javascript – 有效地从DOM中删除文本节点

前端之家收集整理的这篇文章主要介绍了javascript – 有效地从DOM中删除文本节点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
没有太多细节,我正在使用 javascript清理表内的空白.我需要删除大量的文本节点.对于IE9来说,这似乎是我脚本的瓶颈.

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

  1. domNode.removeNode(true);
  2. domNode.nodeValue = "";
  3. domNode.parentNode.removeChild(domNode);

有没有办法进行批量删除或隐藏它们在dom等中的方法.只是更快的东西.

我也在textnodes上尝试了这个:

  1. domNode.innerHTML = '';

虽然它执行得很快,但文本节点似乎没有被它发送.

此外,我需要保留事件绑定,因此整个表上的.innerHTML替换看起来不是一个选项.虽然它的运行速度提高了约5倍.

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

  1. //around 480ms
  2. stripWhitespaceTextNodes(domNode);
  3.  
  4. //around 640ms
  5. parent.removeChild(domNode);
  6. stripWhitespaceTextNodes(domNode);
  7. parent.insertBefore(domNode,nextNode);
  8.  
  9. //around 700ms
  10. tables[i].style.visibility = 'hidden';
  11. stripWhitespaceTextNodes(domNode);
  12. tables[i].style.visibility = 'visible';
  13.  
  14. //around 1140ms
  15. tables[i].style.display = 'none';
  16. stripWhitespaceTextNodes(domNode);
  17. tables[i].style.display = 'block';

这是在4个表上完成的,其中一个表有1500行.

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

  1. domNode.parentNode.removeChild(domNode);
  2. domNode.removeNode(true);
  3. domNode.nodeValue = ""; // <-- CURRENTLY THIS ONE IS THE TOP RUNNER
  4. domNode.replaceWholeText('');
  5. domNode.deleteData(0,domNode.length);
  6.  
  7. var txtNode = document.createTextNode("");
  8. domNode.parentNode.replaceChild(txtNode,domNode);
  9. parent.insertBefore(domNode,nextNode);
  10.  
  11. //fast but doesn't work
  12. domNode.innerHTML = '';

解决方法

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

所以在你的情况下,那可能是:

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

即使树与页面的DOM分离,事件处理程序仍保持连接状态,因此当树被放回时它们将存在.

猜你在找的JavaScript相关文章