如何使用 JavaScript 更改 span 元素的文本?

IT技术 javascript html
2021-01-11 00:20:01

如果我有一个span,请说:

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

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

6个回答

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

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

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

//POSSIBLY INSECURE IF NEWTEXT BECOMES A VARIABLE!!
document.getElementById("myspan").innerHTML="newtext";
@bouncingHippo document.getElementById("myspan").setAttribute("style","cssvalues");
2021-03-31 00:20:01
这不会设置文本,而是设置根本不同HTML
2021-04-02 00:20:01
@gregoire - 正如其他人已经指出的那样,您的答案很容易受到 XSS 的攻击。这个问题已经被查看了大约 80k 次,这意味着很多人可能已经接管了这个解决方案,并且可能引入了不必要的 xss 泄漏。您是否可以考虑更新您的答案以改为使用textContent,以便鼓励新人使用正确和安全的方法?
2021-04-04 00:20:01
应该有某种方式将这两个答案合并为一个。它的答案完全相同。
2021-04-06 00:20:01
@Tiddo textContent 在 IE8 及更低版本中不受支持,我希望您永远不要在脚本中直接使用未经处理的用户输入。
2021-04-10 00:20:01

使用的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,我认为通过应用分层安全原则,一切都应该被视为用户输入。这样你就不会遇到任何意外。

@JimboJonny 在谈到诸如此类已被查看超过 650,000 次的问题时,OP 特别提出的问题完全无关紧要。因此,为了公共安全,我认为突出地提及 XSS 漏洞是明智的。
2021-03-22 00:20:01
虽然您innerHTML要求谨慎是完全正确的,但请注意,您的解决方案使用innerText了 Firefox 不支持的内容。quirksmode.org/dom/html它还使用textContent了 IE8 不支持的。您可以构建代码来解决这些问题。
2021-03-23 00:20:01
使用 appendChild 实际上并没有改变文本,它只是增加了文本。在此处使用您的代码,原始问题的跨度最终将阅读“hereismytextyour cool text”。也许span.innerHTML = "";然后appendChild?
2021-03-25 00:20:01
这个问题没有说明用户输入,所以innerHTML不推荐的一揽子声明是荒谬的。更不用说它在消毒后仍然很好。一个人应该过滤用户输入的想法是SO不涉及这一具体问题。至多值得在最后写一个小注释,说“顺便一句:如果是用户输入,请确保首先进行消毒或使用不需要它的 X 方法”
2021-03-27 00:20:01
使用span.appendChild(txt);,而不是!
2021-03-28 00:20:01

编辑:这是在 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';

然而,正如其他人所指出的,如果您不是文本字符串任何部分的来源,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';
}
document.getElementById('myspan').innerHTML = 'newtext';
如果'newtext'包含用户提供的输入,这将导致 XSS 漏洞。
2021-03-18 00:20:01

我使用Jquery,但以上都没有帮助,我不知道为什么,但这有效:

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