为啥用 innerText 替换 InnerHTML 会导致性能下降 15 倍以上

Posted

技术标签:

【中文标题】为啥用 innerText 替换 InnerHTML 会导致性能下降 15 倍以上【英文标题】:why does replacing InnerHTML with innerText causes >15X drop in performance为什么用 innerText 替换 InnerHTML 会导致性能下降 15 倍以上 【发布时间】:2013-10-15 22:00:14 【问题描述】:

这个问题来自我之前的帖子why a tiny reordering of DOM Read/Write operations causes a huge performance difference。

考虑以下代码:

function clearhtml(divs) 
    Array.prototype.forEach.call(divs, function (div) 
        contents.push(div.innerHTML);
        div.innerHTML = "";
    );


function clearText(divs) 
    Array.prototype.forEach.call(divs, function (div) 
        contents.push(div.innerText); //innerText in place of innerHTML
        div.innerHTML = "";
    );

http://jsfiddle.net/pindexis/ZZrYK/

我对 n=100 的测试结果: ClearHTML:~1ms 明文:~15ms

对于 n=1000: ClearHTML:~4ms 明文:~1000ms

我在 google chrome 和 IE 上测试了代码,得到了类似的结果(Firefox 不支持 innerText)。

编辑: 这两个函数之间的差异并不是因为与 innerHTML 相比,innerText 函数的速度较慢,这是肯定的(我尝试删除 div.innerHTML ="" 并获得了性能提升),这里发生了奇怪的浏览器重排。

【问题讨论】:

必须解释其中的 html 标签并只返回可见文本。另一个只是吐出原始 HTML。 Firefox 的等价物是textContent 尝试使用textContent 属性。它比innerText 所有那些新奇的浏览器都支持textContent @JamesMontagne:文档的内存形式几乎肯定更接近 DOM 的表示方式:作为节点树,经过预处理,文本节点基本上是原始字符。 (每当通过 DOM 插入元素时插入 HTML 没有多大意义,并且可能会非常缓慢。)innerHTMLinnerText 一样遍历该树,但它还必须重建 HTML 标签等。 innerText 可以简单地跳过为这些节点生成标签,而不是生成它们并在事后尝试将它们剥离。这应该意味着更少工作。 【参考方案1】:

差异几乎可以肯定来自获取 InnerText 所需的额外努力(我相信它会删除无关标签并仅返回元素内的文本)。另一方面,InnerHTML 只是返回已经被浏览器解析和理解的数据。

【讨论】:

【参考方案2】:

作为MDN explains:

由于 innerText 知道 CSS 样式,它会触发重排,而 textContent 不会。

使用textContent 代替innerText 不会导致回流,而且速度也很快。 IE9+ 和 FFX/Chrome 一样也支持。

【讨论】:

以上是关于为啥用 innerText 替换 InnerHTML 会导致性能下降 15 倍以上的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Textarea.Innertext 给我空点异常? [复制]

使用 JavaScript 替换 innerText 中的 ,不起作用

为啥 innerText,innerHTML 属性不适用于 javascript 中的输入标签?

JavaScript中innerHTML与innerText,createTextNode的区别

JavaScript slice / substring仅在替换HTML innerText时返回未定义

使用 HTML Agility Pack 替换 HTML div InnerText 标签