Como substituo o texto dentro de um elemento div?

166

Eu preciso definir o texto dentro de um elemento DIV dinamicamente. Qual é a melhor abordagem segura para o navegador? Eu tenho prototypejs e scriptaculous disponíveis.

<div id="panel">
  <div id="field_name">TEXT GOES HERE</div>
</div>

Aqui está a aparência da função:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById('field_name');
  //Make replacement here
}
esplêndido
fonte
A resposta aceita faz o que você deseja quando o texto atribuído é: - <span style = "font-size: 36pt"> Isso é grande </span>. Se esse comportamento é desejável, você pode reformular a pergunta para corresponder?
AnthonyWJones
Isso poderia ser usado em um ataque de injeção de XSS?
James Westgate

Respostas:

49

Eu usaria o updatemétodo Prototype, que suporta texto sem formatação, um trecho de HTML ou qualquer objeto JavaScript que defina um toStringmétodo.

$("field_name").update("New text");
John Topley
fonte
26
@Aeyoun O OP deu a entender que eles já estavam usando o Prototype, por isso, se for esse o caso, faz sentido tirar vantagem disso.
John Topley
6
Por que para mim só trabalha com?$("field_name").text("new text");
Drako
@Drako Você está usando PrototypeJS?
John Topley
10
@Drako A pergunta original e minha resposta de sete anos atrás são para PrototypeJS e não jQuery.
John Topley
255

Você pode simplesmente usar:

fieldNameElement.innerHTML = "My new text!";
17 de 26
fonte
2
Não devem ser usadas aspas simples para texto 'estático'?
Milan Babuškov 23/09/08
5
Em PHP, sim. Em JavaScript, não acredito que isso importe.
ceejayoz
46
Em Javascript, aspas simples e duplas são intercambiáveis.
17 de 26
18
maus conselhos, porque o texto pode conter HTML-marcação-like conteúdo por acidente
Trident D'Gao
10
element.innerHTML = "<script>doSomethingMalicious()</script>";não será uma boa ideia. element.innerHTML = "& neither will this";
Joseph Nields
175

Atualizado para todos que leem isso em 2013 e posteriores:

Essa resposta tem muito SEO, mas todas as respostas estão seriamente desatualizadas e dependem de bibliotecas para fazer o que todos os navegadores atuais fazem de imediato.

Para substituir o texto dentro de um elemento div, use Node.textContent, que é fornecido em todos os navegadores atuais.

fieldNameElement.textContent = "New text";
mikemaccana
fonte
10
@Legolas Por isso, escrevi o 'navegador atual' há dois anos.
Mikemaccana
2
Obrigado! Eu estava tentando as outras respostas, me perguntando por que 'innerHTML' não estava funcionando.
GreySage
2
Você pode pensar em por que textContentum método superior é innerHTML: é mais rápido, mais seguro e mais apropriado quando não estiver tentando inserir deliberadamente a marcação HTML.
CertainPerformance
75

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById("field_name");
  while(fieldNameElement.childNodes.length >= 1) {
    fieldNameElement.removeChild(fieldNameElement.firstChild);
  }
  fieldNameElement.appendChild(fieldNameElement.ownerDocument.createTextNode(fieldName));
}

As vantagens de fazê-lo desta maneira:

  1. Ele usa apenas o DOM, portanto, a técnica é portátil para outros idiomas e não depende do innerHTML não padrão
  2. fieldName pode conter HTML, que pode ser uma tentativa de ataque XSS. Se sabemos que é apenas texto, devemos criar um nó de texto, em vez de o navegador analisá-lo em HTML

Se eu fosse usar uma biblioteca javascript, usaria o jQuery e faria o seguinte:


  $("div#field_name").text(fieldName);

Observe que o comentário de @AnthonyWJones está correto: "field_name" não é um ID ou nome de variável particularmente descritivo.

Daniel Papasian
fonte
Em quais outros idiomas você pode portar essa técnica?
John Topley
Qualquer idioma com uma implementação DOM suporta isso (e a maioria dos idiomas possui uma implementação DOM).
Quentin
Esta é uma boa resposta, melhor que a minha e é a resposta correta. Você pode considerar arrumar o exemplo. 'fieldname' não é um bom nome para o parâmetro da função. De fato, seria melhor usar dois um para o ID do elemento e outro para o conteúdo, ou seja; elemID, content
AnthonyWJones
Peguei emprestado fieldName e o ID da própria pergunta.
Daniel Papasian 23/09/08
A pergunta provavelmente usou nome_do_campo para tornar o exemplo genérico. O questionador também menciona que o Prototype está disponível, mas não o jQuery.
John Topley
17
$('field_name').innerHTML = 'Your text.';

Uma das características bacanas do Prototype é que $('field_name') faz a mesma coisa que document.getElementById('field_name'). Use-o! :-)

A resposta de John Topley usando a updatefunção Prototype é outra boa solução.

ceejayoz
fonte
4
Isso não parece com JavaScript?
Milan Babuškov 23/09/08
1
Não use innerHTML. Não é uma recomendação do w3c e se comporta de forma inconsistente. É considerado um estilo ruim.
Tom
Tom, o que deve ser usado (se você não usa o Prototype)?
Milan Babuškov 23/09/08
1
Milão, a maneira mais aceita é percorrer os childNodes, chamar removeNode (true) em cada um e anexar novos nós criados usando document.createElement () ou document.createTextNode (). Se você precisar fazer isso, recomendo escrever uma função para evitar muita digitação.
Joel Anair 24/09/08
3
@RaduSimionescu Não, não é. Esta pergunta e resposta são sobre Prototype.js, não jQuery. No Prototype, $procura um item por ID. Não é baseado em seletor como o jQuery. api.prototypejs.org/dom/dollar
ceejayoz
15

A resposta rápida é usar innerHTML (ou o método de atualização do protótipo que praticamente faz a mesma coisa). O problema com o innerHTML é que você precisa escapar do conteúdo que está sendo atribuído. Dependendo dos seus alvos, você precisará fazer isso com outro código OU

no IE: -

document.getElementById("field_name").innerText = newText;

em FF: -

document.getElementById("field_name").textContent = newText;

(Na verdade, da FF tem o seguinte presente no código)

HTMLElement.prototype.__defineGetter__("innerText", function () { return this.textContent; })

HTMLElement.prototype.__defineSetter__("innerText", function (inputText) { this.textContent = inputText; })

Agora eu posso usar o innerText se você precisar do suporte mais amplo possível ao navegador, então essa não é uma solução completa, mas também não é o innerHTML no estado bruto.

AnthonyWJones
fonte
7

Se você realmente deseja que continuemos de onde parou, você pode:

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';
Milan Babuškov
fonte
5

nodeValue também é uma propriedade DOM padrão que você pode usar:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);
  if(fieldNameElement.firstChild)
    fieldNameElement.firstChild.nodeValue = "New Text";
}
palswim
fonte
4
el.innerHTML='';
el.appendChild(document.createTextNode("yo"));
Adrian Adkison
fonte
1

Se você está inclinado a começar a usar muito JavaScript em seu site, o jQuery torna extremamente simples jogar com o DOM.

http://docs.jquery.com/Manipulation

Torna tão simples quanto: $ ("# field-name"). Text ("Some new text.");

Steve Perks
fonte
O protótipo possui funções utilitárias semelhantes.
ceejayoz
1

Use innerText se você não puder assumir a estrutura - Use Text # data para atualizar o texto existente Performance Test

Revolução juvenil
fonte
0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}
hollystyles
fonte
É melhor substituir o nó do que removê-lo e adicionar um novo como duas operações separadas.
Quentin
0

Aqui está uma maneira fácil do jQuery :

var el = $('#yourid .yourclass');

el.html(el.html().replace(/Old Text/ig, "New Text"));
Cosmin
fonte
Parece uma péssima idéia - e se o seu elemento contiver subnós com o mesmo texto ou se o seu texto corresponder a parte do nome de uma tag do elemento? Por que não usar apenas .text?
James Westgate
Concordo plenamente com James Westgate, não deveria fazer isso.
TREPRODUZINDO #
0

Em HTML, coloque isso

<div id="field_name">TEXT GOES HERE</div>

Em Javascript coloque isso

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
Azhar hussain
fonte