我使用普通的js来改变标签元素的内部文本,我不确定我应该使用innerHTML或nodeValue或textContent。我不需要创建新节点或更改HTML元素或任何东西 - 只需替换文本。以下是代码示例:
var myLabel = document.getElementById("#someLabel");
myLabel.innerHTML = "Some new label text!"; // this works
myLabel.firstChild.nodeValue = "Some new label text!"; // this also works.
myLabel.textContent = "Some new label text!"; // this also works.
我查看了jQuery源代码,它使用了nodeValue一次,但是使用了innerHTML和textContent几次。然后我发现这个jsperf测试表明firstChild.nodeValue明显更快。至少这就是我所说的意思。
如果firstChild.nodeValue快得多,那捕获的是什么?它没有得到广泛支持吗?还有其他问题吗?
答案 0 :(得分:130)
Differences between textContent/innerText/innerHTML on MDN.
And a Stackoverflow answer about innerText/nodeValue.
<强>摘要强>
innerText
,但现在所有主流浏览器都支持。
答案 1 :(得分:50)
.textContent
输出text/plain
,而.innerHTML
输出text/html
。
快速举例:
var example = document.getElementById('exampleId');
example.textContent = '<a href="https://google.com">google</a>';
输出:&lt; a href =&#34; http://google.com"&gt; google&lt; / a&gt;
example.innerHTML = '<a href="https://google.com">google</a>';
输出:google
从第一个示例可以看出,浏览器未解析类型text/plain
的输出,导致显示完整内容。类型text/html
的输出告诉浏览器在显示它之前解析它。
答案 2 :(得分:6)
我熟悉和使用的两个是innerHTML和 textContent 。
当我只想更改段落或标题的文本时,我使用 textContent :
var heading = document.getElementById('heading')
var paragraph = document.getElementById('paragraph')
setTimeout(function () {
heading.textContent = 'My New Title!'
paragraph.textContent = 'My second <em>six word</em> story.'
}, 2000)
&#13;
em { font-style: italic; }
&#13;
<h1 id="heading">My Title</h1>
<p id="paragraph">My six word story right here.</p>
&#13;
所以, textContent 只是更改了文本,但它并没有解析HTML,因为我们可以从结果中的纯文本中看到的标签中看出来。
如果我们要解析HTML,我们会像这样使用 innerHTML :
var heading = document.getElementById('heading')
var paragraph = document.getElementById('paragraph')
setTimeout(function () {
heading.innerHTML = 'My <em>New</em> Title!'
paragraph.innerHTML = 'My second <em>six word</em> story.'
}, 2000)
&#13;
em { font-style: italic; }
&#13;
<h1 id="heading">My Title</h1>
<p id="paragraph">My six word story right here.</p>
&#13;
因此,第二个示例将我分配给DOM元素的 innerHTML 属性的字符串解析为HTML。
这很棒,而且是一个很大的安全漏洞:)
(如果您想了解安全性,请查看XSS)
答案 3 :(得分:2)
innerText 大致是您选择文本并将其复制后的内容。内部文本中不存在未呈现的元素。
textContent 是子树中所有 TextNodes值的串联。是否渲染。
这是一个详细说明差异的great post
答案 4 :(得分:0)
[注意:这篇文章更多是关于共享可能对某人有用的特定数据,而不是告诉别人该怎么做]
如果有人想知道今天最快的是什么: https://jsperf.com/set-innertext-vs-innerhtml-vs-textcontent &https://jsperf.com/get-innertext-vs-innerhtml-vs-textcontent(对于第二个测试,跨度的内容为纯文本,结果可能会根据其内容而变化)
就纯速度而言,.innerHtml
似乎是伟大的赢家!
(注意:我只是在这里谈论速度,您可能希望在选择使用哪个标准之前先寻找其他条件!)
答案 5 :(得分:0)
Element.innerHTML属性设置为set
或get
元素的HTML代码。
例如:我们有一个<h1>
标签,并带有强烈的风格:
<h1 id="myHeader" style="color: green"><strong>My Header</strong> Normal Text</h1>
要使元素的内容get
的ID等于“ myHeader”,我们将执行以下操作:
var element = document.getElementById("myHeader");
element.innerHTML
返回结果:
<strong>My Header</strong> Normal Text`
要“设置”该元素的新内容(值),代码将在此处:
Element.innerHTML = "My Header My Text";
因此,此属性不仅适用于纯文本,而且旨在传递或复制HTML代码。
=>我们不应该使用它。
但是,许多程序员(包括我自己)使用此属性在网页中插入文本,这种方法存在潜在的风险:
由于这个原因,不建议在插入纯文本时使用innerHTML
,而应使用textContent
。 textContent
属性将无法理解您传递的代码是HTML语法,而只是100%的文本而已。
如果在上例中使用textContent
,则返回结果:
My Header My Text