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


388

如果我有跨度,请说:

<span id="myspan"> hereismytext </span>

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

Answers:


636

对于现代浏览器,您应该使用:

document.getElementById("myspan").textContent="newtext";

尽管较旧的浏览器可能不知道textContent,但不建议使用,innerHTML因为当用户输入新文本时,它会引入XSS漏洞(有关更多详细讨论,请参见下面的其他答案):

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

2
@bouncingHippo document.getElementById(“ myspan”)。setAttribute(“ style”,“ cssvalues”);
gregoire's

3
应该有某种方式将这两个答案合并为一个。其完全相同的答案。
Hermann Ingjaldsson 2014年

7
这不会设置文本,而是会设置根本不同的HTML
Brad 2014年

22
@gregoire-正如其他人已经指出的那样,您的答案很容易受到XSS的攻击。这个问题已经被浏览了大约8万次,这意味着很多人可能已经接管了该解决方案,并且可能引入了不必要的xss泄漏。您是否可以考虑更新答案以textContent代替使用,以便鼓励新人们使用正确且安全的方法?
Tiddo

2
IE8及以下版本不支持@Tiddo textContent,我希望您不要在脚本中直接使用未经消毒的用户输入。
Gregoire 2015年

75

使用的innerHTMLSO不推荐。相反,您应该创建一个textNode。这样,您就可以“绑定”您的文本,并且至少在这种情况下,您不容易受到XSS攻击。

document.getElementById("myspan").innerHTML = "sometext"; //INSECURE!!

正确的方式:

span = document.getElementById("myspan");
txt = document.createTextNode("your cool text");
span.appendChild(txt);

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

2017年11月4日编辑:

根据@mumush建议修改了第三行代码:“改为使用appendChild();”。
顺便说一句,根据@Jimbo Jonny所说,我认为应该通过应用“分层安全性”原则将所有内容都视为用户输入。这样,您就不会遇到任何惊喜。


6
尽管绝对正确innerHTML,但请注意,您的解决方案使用innerTextFirefox不支持的解决方案。quirksmode.org/dom/html它还使用textContentIE8中不支持的功能。您可以构建代码来解决这些问题。
Trott 2014年

4
使用span.appendChild(txt);,而不是!
mumush

34
该问题没有说明用户输入,因此innerHTML不推荐使用笼统的声明是荒谬的。更不用说消毒后还是可以的。一个人应该过滤用户输入的想法是SO不涉及这一具体问题。最多在末尾有个小字条:“顺便一句:如果是用户输入,请确保先进行消毒或使用不需要的X方法”
Jimbo Jonny

另外,创建元素比使用innerHTML更快。
Samuel Rondeau-Millaire '16

4
实际上,使用appendChild不会更改文本,而只会添加文本。在此处使用您的代码,原始问题的范围最终将显示为“ hereismytexty您的酷文本”。也许span.innerHTML = "";那么appendChild?
ShaneSauce

29
document.getElementById('myspan').innerHTML = 'newtext';

24

编辑:这是在2014年编写的。您可能不再关心IE8了,可能会忘记使用innerTexttextContenthooray,只需使用并完成它。

如果您是提供文本的用户,而用户(或您无法控制的其他来源)没有提供文本的任何部分,则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';

但是,正如其他人指出的那样,如果您不是文本字符串任何部分的来源,innerHTML则如果您不小心首先对文本进行清理,则使用可能会使您遭受诸如XSS之类的内容注入攻击。

如果您使用的是来自用户的输入,则这是一种安全地进行输入同时又保持跨浏览器兼容性的方法:

var span = document.getElementById('myspan');
span.innerText = span.textContent = 'newtext';

Firefox不支持innerText,IE8不支持,textContent因此如果要保持跨浏览器的兼容性,则需要同时使用两者。

并且,如果您想避免回流焊(由引起innerText),请执行以下操作:

var span = document.getElementById('myspan');
if ('textContent' in span) {
    span.textContent = 'newtext';
} else {
    span.innerText = 'newtext';
}

18

我使用Jquery并且以上方法均无济于事,我不知道为什么,但这有效:

 $("#span_id").text("new_value");

7

这是另一种方式:

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

if (myspan.innerText) {
    myspan.innerText = "newtext";
}
else
if (myspan.textContent) {
        myspan.textContent = "newtext";   
}

Safari,Google Chrome和MSIE将检测innerText属性。对于Firefox,标准的处理方式是使用textContent,但是自版本45起,它也具有innerText属性,因为最近有人告诉我。此解决方案进行测试,以查看浏览器是否支持这些属性之一,如果支持,则分配“ newtext”。

现场演示:这里


1
Firefox在版本45中实现了innerText支持。
user3351605 2016年


1

您还可以使用querySelector()方法,假设“ myspan” ID是唯一的,因为该方法返回具有指定选择器的第一个元素:

document.querySelector('#myspan').textContent = 'newtext';

developer.mozilla



0
document.getElementById("myspan").textContent="newtext";

这将选择ID为的dom-node myspan并将其文本内容更改为new text



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.