innerText vs innerHTML vs label vs text vs textContent vs outerText

Posted

技术标签:

【中文标题】innerText vs innerHTML vs label vs text vs textContent vs outerText【英文标题】: 【发布时间】:2014-08-17 03:14:35 【问题描述】:

我有一个由 javascript 填充的下拉列表。

在决定加载时显示的默认值时,我意识到以下属性显示的值完全相同:

innerText innerhtml label text textContent outerText

我自己的研究显示了一些基准测试或比较,但不是全部。

我可以根据自己的常识选择 1 或其他,因为它们提供相同的结果,但是,我担心如果数据发生变化,这将不是一个好主意。

我的发现是:

innerText 将按原样显示值并忽略可能包含的任何 HTML 格式 innerHTML 将显示值并应用任何 HTML 格式 label 好像和innerText 一样,所以看不出区别 text 似乎与 innerText 相同,但为 jQuery 速记版本 textContent 看起来与 innerText 相同,但保留格式(例如 \nouterText 似乎与 innerText 相同

我的研究只能让我走到尽头,因为我只能测试我能想到的或阅读已发表的内容,任何人都可以确认我的研究是否正确以及label 和 @987654349 是否有什么特别之处@?

【问题讨论】:

访问文本的方式如此之多的原因之一是跨浏览器的差异。如果您已经在使用 jQuery,您应该使用 .text() 来获取元素的文本内容,因为这将提供最大的跨浏览器支持。 developer.mozilla.org/en-US/docs/Web/API/… MDN 文档:innerTextinnerHTML (for ShadowRoots)、label and textlabeltext 也存在于许多与媒体相关的原型中)、textContentouterText. 也相关:outerHTMLnodeValuewholeText 【参考方案1】:

来自MDN:

Internet Explorer 引入了 element.innerText。意图与 [as textContent] 几乎相同,但有一些不同之处:

请注意,虽然 textContent 获取所有元素的内容,包括 <script><style> 元素,但大多数等效的 IE 特定属性 innerText 却没有。

innerText 也知道样式,不会返回隐藏元素的文本,而 textContent 会。

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

所以innerText 不会包含被 CSS 隐藏的文本,但textContent 会。

innerHTML 如其名称所示返回 HTML。很多时候,为了在元素中检索或写入文本,人们使用 innerHTML。应该使用 textContent 代替。因为文本不被解析为 HTML,所以它可能具有更好的性能。此外,这避免了 XSS 攻击向量。

如果您错过了,让我更清楚地重复一遍:不要不要使用.innerHTML,除非您特别打算在元素中插入 HTML 并已采取必要的预防措施以确保您插入的 HTML 不能包含恶意内容。如果您只想插入文本,请使用.textContent,或者如果您需要支持 IE8 及更早版本,请使用功能检测在.textContent.innerText 之间关闭。

有这么多不同属性的一个主要原因是,不同的浏览器最初对这些属性有不同的名称,并且仍然没有对所有这些属性进行完整的跨浏览器支持。如果您使用 jQuery,则应坚持使用 .text(),因为它旨在消除跨浏览器的差异。*

对于其他一些:outerHTMLinnerHTML 基本相同,只是它包含了它所属元素的开始和结束标记。我似乎根本找不到对outerText 的太多描述。我认为这可能是一个不起眼的遗留属性,应该避免。

【讨论】:

该文档的建议 in order to retrieve or write text within an element, people use innerHTML. textContent should be used instead 的问题在于,IE 8 不支持 textContent,IE 8 仍在广泛使用,因为这是与 Windows 捆绑在一起的版本7. FireFox 不支持innerText。因此,虽然 innerHTML 不是非常适合该目的,但它具有更好的跨浏览器可靠性。 @AdiInbar 如果您需要支持旧浏览器,正确的做法是使用特征检测在.textContent.innerText 之间关闭,或者使用像jQuery 这样的东西来平滑这些浏览器差异。 非常感谢您的解释!我正在使用 flot 来显示图表,但它没有显示在 ff 中,因为 ff 使用 textContent。当我使用 tickFormatter 时,Innertext 总是未定义。 @bvl 您不能将textContent 与 HTML 标记一起使用。如果需要插入 HTML,可以使用.innerHTML 或使用document.createElement() 等构建 HTML 节点。 安全性: innerHTML 的错误使用(与textContent 不同)可能会为您的应用程序的 XSS(跨站点脚本)攻击打开大门。如果通过innerHTML 插入DOM 的内容不完全受信任,攻击者可以使用<script> 元素劫持在用户或管理员授权级别下通过身份验证的应用程序。在这种情况下,只需使用textContent 而不是危险的innerHTML,就可以有效地摧毁所有攻击,包括像<img src="x.x" onerror="alert('Hacked!');"/> 这样看起来很奇怪的攻击和无数偷偷摸摸的攻击。 【参考方案2】:

JLRishe 的其他出色答案的附录:

innerText 和outerText 都存在的原因是为了与innerHTML 和outerHTML 对称。当您分配属性时,这一点变得很重要。

假设你有一个元素 e 和 HTML 代码 <b>Lorem Ipsum</b>

e.innerHTML = "<i>Hello</i> World!"; => <b><i>Hello</i> World!</b>
e.outerHTML = "<i>Hello</i> World!"; =>    <i>Hello</i> World!
e.innerText = "Hello World!";        => <b>Hello World!</b>
e.outerText = "Hello World!";        =>    Hello World!

【讨论】:

【参考方案3】:

下拉列表包含Option 对象的集合,因此您应该使用.text 属性来检查元素的文本表示,即

<option value="123">text goes here</option>
                    ^^^^^^^^^^^^^^

顺便说一句,

.text 似乎与.innerText 相同,但为 JQuery 速记版本

这是不正确的; $(element).text() 是 jQuery 版本,而 element.text 是属性访问版本。

【讨论】:

【参考方案4】:

textlabel 删除多余的空格。在下拉列表中查询选项时,我得到了这些结果:

e.textContent = "A    B C   D     "
e.text = "A B C D"
e.label = "A B C D"

【讨论】:

投了赞成票,因为每个人都在谈论其他人,但你是唯一一个比较labeltext的人 @Lars-Lasse 是的,它们是 DOM API 的一部分;正如答案所暗示的,他们是HTMLOptionElements 上的getter / setter。见Web IDL definitions in the HTML spec。此答案可能具有误导性且不完整。 @SebastianSimon 谢谢伙计,没有注意到它与 【参考方案5】:

textContent 不会格式化 (\n)

【讨论】:

【参考方案6】:

如果您针对特定浏览器,请参阅浏览器兼容性http://www.quirksmode.org/dom/html/。因为似乎他们都有自己的做事方式。这就是为什么如果您不想摆弄,最好使用 JQuery .text() (http://api.jquery.com/text/)。

【讨论】:

以上是关于innerText vs innerHTML vs label vs text vs textContent vs outerText的主要内容,如果未能解决你的问题,请参考以下文章

.append VS .html VS .innerHTML 性能

document.write vs console.log vs innerHTML

innerHTML和innerText

Javascript中的innerText和InnerHTML

innerHTML和innerText区分

JS中innerHTML 和innerText和value的区别