2009-08-31 64 views

回答

407
document.getElementById("myspan").innerHTML="newtext"; 

编辑 对于现代的浏览器:

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

表示在这种方式的任何用户提供的字符串之前你应该首先检查它是否包含HTML标记,否则你可能会遇到安全问题(XSS)。 – pafcu 2011-10-14 04:57:12

+0

如何在JavaScript中使用javascript在'span'中插入样式属性? – bouncingHippo 2012-09-10 15:32:40

+1

@bouncingHippo document.getElementById(“myspan”)。setAttribute(“style”,“cssvalues”); – Gregoire 2012-09-11 06:44:47

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

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

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

正确方法:

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

有关此漏洞的更多信息: Cross Site Scripting (XSS) - OWASP

编辑2017年11月4日:

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

+5

尽管您对需要小心的'innerHTML'绝对正确,请注意,您的解决方案使用Firefox内不支持的'innerText'。 http://www.quirksmode.org/dom/html/它也使用IE8中不支持的'textContent'。您可以构造代码来解决这些问题。 – Trott 2014-10-02 15:48:23

+4

使用'span.appendChild(txt);'代替! – mumush 2015-09-03 17:53:49

+17

这个问题没有提到用户输入,所以不推荐使用innerHTML的总括语句是荒谬的。更不用说一旦消毒,它仍然很好。应该对用户输入进行清理的想法是** SO NOT NOTATED **这个特定的问题。在最后,它最好有一个小记录,说“_顺便说一句:如果是用户输入,请确保首先进行消毒或使用不需要它的X方法”_。 – 2016-01-23 20:30:05

19

如果您是一个供给文本和无文本的一部分是由用户提供(或不要控制一些其他源),那么设置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'; 
} 
4

这里的另一种方式:

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

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

innerText属性将通过Safari浏览器,谷歌Chrome和MSIE进行检测。对于Firefox,标准的做法是使用textContent,但从版本45开始,它也有一个innerText属性,正如最近有人亲切地告诉我的。此解决方案测试以查看浏览器是否支持这些属性,如果是,则分配“newtext”。

现场演示:here

+1

Firefox在[release 45](https://developer.mozilla.org/en-US/Firefox/Releases/45)中实现了innerText支持。 – user3351605 2016-09-30 19:21:44

8

我用Jquery并没有以上的帮助,我不知道为什么,但这个工作:

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

对于这个跨度

<span id="name">sdfsdf</span> 

可以是这样的: -

$("name").firstChild.nodeValue = "Hello" + "World";