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
}

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");

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!";

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";

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.


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.


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.


7

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

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';

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";
}


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.");


O protótipo possui funções utilitárias semelhantes.
ceejayoz


0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}

É 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"));

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';}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.