Como altero o texto de um elemento span em JavaScript

388

Se eu tiver um espaço, diga:

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

Como uso o JavaScript para alterar "hereismytext" para "newtext"?

user105033
fonte

Respostas:

636

Para navegadores modernos, você deve usar:

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

Embora os navegadores mais antigos não saibam textContent, não é recomendável usá- innerHTMLlo, pois apresenta uma vulnerabilidade XSS quando o novo texto é uma entrada do usuário (consulte outras respostas abaixo para obter uma discussão mais detalhada):

//POSSIBLY INSECURE IF NEWTEXT BECOMES A VARIABLE!!
document.getElementById("myspan").innerHTML="newtext";
Gregoire
fonte
2
@bouncingHippo document.getElementById ("myspan"). setAttribute ("style", "cssvalues");
Gregoire
3
deve haver alguma maneira de mesclar essas duas respostas em uma. é exatamente a mesma resposta.
Hermann Ingjaldsson
7
Isso não define o texto , define o HTML que é fundamentalmente diferente.
Brad
22
@ gregoire - Como outros já apontaram, sua resposta é vulnerável ao XSS. Essa pergunta já foi vista cerca de 80k vezes, o que significa que muitas pessoas provavelmente assumiram essa solução e podem ter introduzido vazamentos desnecessários de xss. Em textContentvez disso, você poderia considerar a possibilidade de atualizar sua resposta para que novas pessoas sejam incentivadas a usar métodos adequados e seguros?
Tiddo
2
@Tiddo textContent não é suportado no IE8 e abaixo e espero que você nunca use entrada de usuário diretamente não higienizada em seu script.
Gregoire
75

Usando innerHTML é SO NÃO RECOMENDADO . Em vez disso, você deve criar um textNode. Dessa forma, você está "vinculando" seu texto e não é, pelo menos nesse caso, vulnerável a um ataque XSS.

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

O caminho certo:

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

Para mais informações sobre esta vulnerabilidade: Cross Site Scripting (XSS) - OWASP

Editado em 4 de novembro de 2017:

Terceira linha de código modificada de acordo com a sugestão @mumush : "use appendChild (); em vez disso".
Aliás, de acordo com @Jimbo Jonny , acho que tudo deve ser tratado como entrada do usuário, aplicando o princípio Segurança por camadas. Dessa forma, você não encontrará nenhuma surpresa.

nicooo.
fonte
6
Enquanto você estiver absolutamente correto em innerHTMLexigir cautela, observe que sua solução usa o innerTextque não é suportado no Firefox. quirksmode.org/dom/html Ele também usa o textContentque não é suportado no IE8. Você pode estruturar o código para solucionar esses problemas.
Trott
4
Use em span.appendChild(txt);vez disso!
Mumush 03/09/2015
34
A pergunta não diz nada sobre a entrada do usuário; portanto, uma declaração geral que innerHTMLnão é recomendada é ridícula. Sem mencionar que ainda está bom uma vez higienizado. A idéia de que se deve higienizar a entrada do usuário NÃO ESTÁ RELACIONADA A essa pergunta específica. No máximo, ela merece uma pequena nota no final dizendo "btw: se for a entrada do usuário, certifique-se de higienizar primeiro ou usar o método X que não precisa" .
Jimbo Jonny
Além disso, a criação de elementos é MUITO mais rápida do que o uso do innerHTML.
Samuel Rondeau-Millaire 23/03
4
O uso de appendChild, na verdade, não altera o texto, apenas o adiciona. Usando seu código aqui, o período da pergunta original acabaria lendo "aqui, no seu texto interessante". Talvez span.innerHTML = "";então appendChild?
ShaneSauce
29
document.getElementById('myspan').innerHTML = 'newtext';
Dan
fonte
24

EDIT: Isso foi escrito em 2014. Você provavelmente não se importa mais com o IE8 e pode esquecer de usá-lo innerText. Basta usar textContente acabar com isso, viva.

Se você for quem fornece o texto e nenhuma parte do texto é fornecida pelo usuário (ou alguma outra fonte que você não controla), a configuração innerHTMLpode ser aceitável:

// * 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';

No entanto, como outros observam, se você não é a fonte de qualquer parte da cadeia de texto, o uso innerHTMLpode sujeitá-lo a ataques de injeção de conteúdo como o XSS, se você não tomar cuidado para limpar o texto primeiro.

Se você estiver usando informações do usuário, aqui está uma maneira de fazê-lo com segurança, mantendo também a compatibilidade entre navegadores:

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

O Firefox não suporta innerTexte o IE8 não suporta, textContentportanto, você precisará usar os dois se quiser manter a compatibilidade entre navegadores.

E se você quiser evitar refluxos (causados ​​por innerText) sempre que possível:

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

Eu uso Jquerye nenhuma das opções acima ajudou, não sei por que, mas isso funcionou:

 $("#span_id").text("new_value");
shellbye
fonte
7

Aqui está outra maneira:

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

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

A propriedade innerText será detectada pelo Safari, Google Chrome e MSIE. Para o Firefox, a maneira padrão de fazer as coisas era usar o textContent, mas desde a versão 45 ela também possui uma propriedade innerText, como alguém gentilmente me avisou recentemente. Esta solução testa para verificar se um navegador suporta uma dessas propriedades e, se houver, atribui o "novo texto".

Demonstração ao vivo: aqui

slevy1
fonte
11
O Firefox implementou o suporte innerText na versão 45 .
user3351605
4

Além das respostas puras de javascript acima, você pode usar o método de texto jQuery da seguinte maneira:

$('#myspan').text('newtext');

Se você precisar estender a resposta para obter / alterar o conteúdo html de um elemento span ou div, faça o seguinte:

$('#mydiv').html('<strong>new text</strong>');

Referências:

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

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

Mohamed Nagieb
fonte
1

Você também pode usar o método querySelector (), assumindo que o ID 'myspan' seja único, pois o método retorna o primeiro elemento com o seletor especificado:

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

developer.mozilla

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

isso selecionará nó-dom com id myspane alterará o conteúdo de texto paranew text

empresa transborda
fonte
0

Você pode fazer

 document.querySelector ("[Span]"). textContent = "content_to_display"; 

trustidkid
fonte
qual é a diferença com a resposta que dei?
Addis
-1

Para este período

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

Você pode ir assim: -

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