如何在JavaScript中更改span元素的文本

use*_*033 352 html javascript

如果我有一个跨度,说:

<span id="myspan"> hereismytext </span>
Run Code Online (Sandbox Code Playgroud)

如何使用JavaScript将"hereismytext"更改为"newtext"?

Gre*_*ire 580

document.getElementById("myspan").textContent="newtext";
Run Code Online (Sandbox Code Playgroud)

对于现代浏览器:

//POSSIBLY INSECURE IF NEWTEXT BECOMES A VARIABLE!!
document.getElementById("myspan").innerHTML="newtext";
Run Code Online (Sandbox Code Playgroud)

  • 在以这种方式显示任何用户提供的字符串之前,您应该首先检查它是否包含HTML标记,否则您可能会遇到安全问题(XSS). (29认同)
  • @gregoire - 正如其他人已经指出的那样,你的答案很容易受到XSS的攻击.这个问题已经被观看了大约80k次,这意味着很多人可能已经接管了这个解决方案并且可能引入了不必要的xss泄漏.您是否可以考虑更新您使用`textContent`的答案,以便鼓励新人使用正确且安全的方法? (17认同)
  • 这不会设置**文本**,它会设置**HTML**,这是根本不同的. (7认同)
  • 应该有一些方法将这两个答案合二为一.它完全相同的答案. (3认同)
  • @bouncingHippo document.getElementById("myspan").setAttribute("style","cssvalues"); (2认同)
  • IE8及以下版本不支持@Tiddo textContent,我希望您永远不要在脚本中直接使用非清理用户输入. (2认同)
  • **提示:**看下面的博客文章并没有什么坏处:[可怜的,被误解的内部文本](http://perfectionkills.com/the-poor-misunderstood-innerText/)很棒的文章来获取一个关于`.innerText`和`.textContent`之间差异的想法,表现以及在幕后发生的事情.IMO提供了一些重要信息.:) (2认同)

nic*_*oo. 70

使用innerHTML不推荐的.相反,您应该创建一个textNode.通过这种方式,您可以"绑定"您的文本,至少在这种情况下,您不会受到XSS攻击.

document.getElementById("myspan").innerHTML = "sometext"; //INSECURE!!
Run Code Online (Sandbox Code Playgroud)

正确的方式:

span = document.getElementById("myspan");
txt = document.createTextNode("your cool text");
span.appendChild(txt);
Run Code Online (Sandbox Code Playgroud)

有关此漏洞的更多信息: 跨站点脚本(XSS) - OWASP

2017年4月4日编辑:

根据@mumush建议修改第三行代码:"使用appendChild();而不是".
顺便说一句,根据@Jimbo Jonny的说法,我认为通过应用层次安全原则,一切都应该被视为用户输入.这样你就不会遇到任何意外.

  • 问题没有说明用户输入,因此不推荐使用"innerHTML"的一揽子声明是荒谬的.更不用说一旦消毒它仍然很好.人们应该清理用户输入的想法与这个具体问题无关.最多它最后应该留下一个小小的音符,说"_顺便说一下:如果它的用户输入确保首先消毒或使用不需要它的X方法"_. (30认同)
  • 虽然你对"innerHTML"要求谨慎是绝对正确的,但请注意你的解决方案使用了Firefox不支持的`innerText`.http://www.quirksmode.org/dom/html/它还使用了IE8中不支持的`textContent`.您可以构造代码来解决这些问题. (5认同)
  • 使用`span.appendChild(txt);`代替! (4认同)
  • @JimboJonny 当谈到诸如此类已被观看超过 650,000 次的问题时,OP 具体询问的内容完全无关。因此,我确实认为,为了公共安全的利益,突出提及 XSS 漏洞是谨慎的做法。 (3认同)
  • 实际上,使用appendChild不会更改文本,而只会添加文本。在这里使用您的代码,原始问题的范围最终将显示为“ hereismytexty您的酷文本”。也许`span.innerHTML =“”;`然后是appendChild? (2认同)

Dan*_*Dan 28

document.getElementById('myspan').innerHTML = 'newtext';
Run Code Online (Sandbox Code Playgroud)

  • 如果“newtext”包含用户提供的输入,这将导致 XSS 漏洞。 (2认同)

Tro*_*ott 23

编辑:这是写于2014年.你可能不再关心IE8,可以忘记使用innerText.只是使用textContent并完成它,万岁.

如果您是提供文本的人,并且文本的任何部分都不是由用户(或您无法控制的其他来源)提供的,那么设置innerHTML可能是可接受的:

// * Fine for hardcoded text strings like this one or strings you otherwise 
//   control.
// * Not OK for user-supplied input or strings you don't control unless
//   you know what you are doing and have sanitized the string first.
document.getElementById('myspan').innerHTML = 'newtext';
Run Code Online (Sandbox Code Playgroud)

但是,正如其他人所说,如果您不是文本字符串任何部分的来源,innerHTML如果您不小心首先正确清理文本,使用可能会使您受到XSS等内容注入攻击.

如果您使用的是用户的输入,这里有一种方法可以安全地执行此操作,同时还可以保持跨浏览器的兼容性:

var span = document.getElementById('myspan');
span.innerText = span.textContent = 'newtext';
Run Code Online (Sandbox Code Playgroud)

Firefox不支持innerText,IE8不支持,textContent因此如果要保持跨浏览器兼容性,则需要同时使用它们.

如果你想尽可能避免回流(由此引起innerText):

var span = document.getElementById('myspan');
if ('textContent' in span) {
    span.textContent = 'newtext';
} else {
    span.innerText = 'newtext';
}
Run Code Online (Sandbox Code Playgroud)


she*_*bye 14

我使用Jquery并没有上述任何帮助,我不知道为什么但这有效:

 $("#span_id").text("new_value");
Run Code Online (Sandbox Code Playgroud)


sle*_*vy1 7

这是另一种方式:

var myspan = document.getElementById('myspan');

if (myspan.innerText) {
    myspan.innerText = "newtext";
}
else
if (myspan.textContent) {
        myspan.textContent = "newtext";   
}
Run Code Online (Sandbox Code Playgroud)

Safari,Google Chrome和MSIE将检测innerText属性.对于Firefox,标准的处理方式是使用textContent,但是从版本45开始它也有一个innerText属性,最近有人向我提出了通知.此解决方案测试浏览器是否支持这些属性中的任何一个,如果支持,则分配"newtext".

现场演示:这里


Ben*_*het 6

许多人(2022 年)仍然遇到这个问题,并且可用的答案并不是最新的。

使用innerText是最好的方法

正如您在MDM 文档 中看到的,innerText这是通过 Javascript 检索和更改 HTML 元素文本的最佳方法<span>

innerText属性得到了很好的支持(根据 Caniuse 的数据,97.53%的网络用户)

如何使用

使用如下属性简单检索和设置新文本:

let mySpan = document.getElementById("myspan");

console.log(mySpan.innerText);

mySpan.innerText = "Setting a new text content into the span element.";
Run Code Online (Sandbox Code Playgroud)

为什么比 更好innerHTML

不要使用innerHTML用户输入来更新内容,这可能会导致重大漏洞,因为您将设置的字符串内容将被解释并转换为 HTML 标记。

这意味着用户可以将脚本插入您的站点,这称为 XSS 攻击/漏洞(跨站点脚本)。

为什么比 更好textContent

第一点textContent不受 IE8 支持(但我认为到 2022 年就没有人再关心了)。但主要元素是您可以使用textContent而不是获得的结果的真正差异innerText

MDM 文档中的示例非常适合说明这一点,因此我们有以下设置:

<p id="source">
  <style>#source { color: red;  } #text { text-transform: uppercase; }</style>
<span id=text>Take a look at<br>how this text<br>is interpreted
       below.</span>
  <span style="display:none">HIDDEN TEXT</span>
</p>
Run Code Online (Sandbox Code Playgroud)

如果使用innerText检索<p id="source">我们得到的文本内容:

TAKE A LOOK AT
HOW THIS TEXT
IS INTERPRETED BELOW.
Run Code Online (Sandbox Code Playgroud)

这正是我们想要的。

现在使用textContent我们得到:


  #source { color: red;  } #text { text-transform: uppercase; }
Take a look athow this textis interpreted
       below.
  HIDDEN TEXT
Run Code Online (Sandbox Code Playgroud)

不完全是你所期望的......

这就是为什么使用textContent不是正确的方法。

最后一点

如果您的目标只是将文本附加到<p><span>HTML 元素,那么nicooo 的答案是。是的,您可以创建一个新的文本节点并将其附加到现有元素,如下所示:

TAKE A LOOK AT
HOW THIS TEXT
IS INTERPRETED BELOW.
Run Code Online (Sandbox Code Playgroud)


Moh*_*ieb 5

除了上面的纯 javascript 答案,您还可以使用 jQuery文本方法,如下所示:

$('#myspan').text('newtext');
Run Code Online (Sandbox Code Playgroud)

如果您需要扩展答案以获取/更改span 或 div 元素的html内容,您可以这样做:

$('#mydiv').html('<strong>new text</strong>');
Run Code Online (Sandbox Code Playgroud)

参考:

.text(): http://api.jquery.com/text/

.html(): http://api.jquery.com/html/