¿Cómo reemplazo el texto dentro de un elemento div?

166

Necesito establecer el texto dentro de un elemento DIV dinámicamente. ¿Cuál es el mejor enfoque seguro para el navegador? Tengo prototypejs y scriptaculous disponibles.

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

Así se verá la función:

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById('field_name');
  //Make replacement here
}
sblundy
fuente
¿La respuesta aceptada hace lo que desea cuando el texto asignado es: - <span style = "font-size: 36pt"> Esto es grande </span>. Si este comportamiento es deseable, ¿puedes reformular la pregunta para que coincida?
AnthonyWJones
¿Podría esto usarse en un ataque de inyección XSS?
James Westgate

Respuestas:

49

Usaría el updatemétodo de Prototype que admite texto sin formato, un fragmento de HTML o cualquier objeto de JavaScript que defina un toStringmétodo.

$("field_name").update("New text");
John Topley
fuente
26
@Aeyoun El OP implicaba que ya estaban usando Prototype, por lo que si ese es el caso, tiene sentido aprovecharlo.
John Topley
66
Por qué para mí solo funciona$("field_name").text("new text");
Drako
@Drako ¿Estás utilizando PrototypeJS?
John Topley
10
@Drako La pregunta original y mi respuesta de hace siete años son para PrototypeJS, no para jQuery.
John Topley
255

Simplemente puede usar:

fieldNameElement.innerHTML = "My new text!";
17 de 26
fuente
2
¿No deberían usarse comillas simples para el texto 'estático'?
Milan Babuškov
55
En PHP, sí. En JavaScript, no creo que importe.
ceejayoz
46
En Javascript, las comillas simples y dobles son intercambiables.
17 de 26
18
mal consejo, porque el texto puede contener contenido similar al marcado HTML por accidente
Trident D'Gao
10
element.innerHTML = "<script>doSomethingMalicious()</script>";No será una buena idea. element.innerHTML = "& neither will this";
Joseph Nields
175

Actualizado para todos los que lean esto en 2013 y posteriores:

Esta respuesta tiene mucho SEO, pero todas las respuestas están muy desactualizadas y dependen de las bibliotecas para hacer cosas que todos los navegadores actuales hacen de forma inmediata.

Para reemplazar el texto dentro de un elemento div, use Node.textContent, que se proporciona en todos los navegadores actuales.

fieldNameElement.textContent = "New text";
mikemaccana
fuente
10
@Legolas Por lo tanto, escribí 'navegador actual' hace dos años.
mikemaccana
2
¡Gracias! Estaba probando las otras respuestas, preguntándome por qué 'innerHTML' no estaba funcionando.
GreySage
2
Puede considerar explicar por qué textContentes un método superior para innerHTML: es más rápido, más seguro y más apropiado cuando no intenta insertar deliberadamente el marcado 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));
}

Las ventajas de hacerlo de esta manera:

  1. Solo usa DOM, por lo que la técnica es portátil a otros idiomas y no se basa en el innerHTML no estándar
  2. fieldName podría contener HTML, que podría ser un intento de ataque XSS. Si sabemos que es solo texto, deberíamos crear un nodo de texto, en lugar de que el navegador lo analice para HTML

Si fuera a usar una biblioteca javascript, usaría jQuery y haría esto:


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

Tenga en cuenta que el comentario de @AnthonyWJones es correcto: "field_name" no es una identificación particularmente descriptiva o un nombre de variable.

Daniel Papasian
fuente
¿A qué otros idiomas podría transferir esta técnica?
John Topley
Cualquier idioma con una implementación DOM lo admite (y la mayoría de los idiomas tienen una implementación DOM).
Quentin
Esta es una buena respuesta, mejor que la mía y es la respuesta correcta. Sin embargo, podría considerar ordenar el ejemplo. 'fieldname' no es un buen nombre para el parámetro de la función. De hecho, podría ser mejor tomar dos, uno para el ID del elemento y otro para el contenido, es decir; elemID, content
AnthonyWJones el
Tomé prestado fieldName y el ID de la pregunta en sí.
Daniel Papasian
La pregunta probablemente utilizó field_name para hacer que el ejemplo sea genérico. También el interrogador menciona que Prototype está disponible pero no jQuery.
John Topley
17
$('field_name').innerHTML = 'Your text.';

Una de las características ingeniosas de Prototype es que $('field_name')hace lo mismo quedocument.getElementById('field_name') . Úsalo! :-)

La respuesta de John Topley usando la updatefunción de Prototype es otra buena solución.

ceejayoz
fuente
44
¿Eso no se parece a JavaScript?
Milan Babuškov
1
No uses innerHTML. No es una recomendación de w3c y se comporta de manera inconsistente. Se considera mal estilo.
Tom
Tom, ¿qué se debe usar en su lugar (si no usas Prototype)?
Milan Babuškov
1
Milán, la forma más aceptada es recorrer los childNodes, llamar a removeNode (true) en cada uno, luego agregar nuevos nodos creados usando document.createElement () o document.createTextNode (). Si necesita hacer eso, le recomendaría escribir una función para evitar escribir mucho.
Joel Anair
3
@RaduSimionescu No, no lo es. Esta pregunta y respuesta es sobre Prototype.js, no jQuery. En Prototype $busca un elemento por ID. No está basado en un selector como lo es jQuery. api.prototypejs.org/dom/dollar
ceejayoz
15

La respuesta rápida es usar innerHTML (o el método de actualización del prototipo que es casi lo mismo). El problema con innerHTML es que necesita escapar del contenido asignado. Dependiendo de sus objetivos, deberá hacerlo con otro código O

en IE: -

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

en FF: -

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

(En realidad, de FF tiene el siguiente presente por código)

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

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

Ahora solo puedo usar innerText si necesita el soporte de navegador más amplio posible, entonces esta no es una solución completa pero tampoco está usando innerHTML en bruto.

AnthonyWJones
fuente
7

Si realmente quieres que continuemos donde lo dejaste, puedes hacer:

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

nodeValue también es una propiedad DOM estándar que puede usar:

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

Si está dispuesto a comenzar a usar mucho JavaScript en su sitio, jQuery hace que jugar con DOM sea extremadamente simple.

http://docs.jquery.com/Manipulation

Lo hace tan simple como: $ ("# nombre-campo"). Text ("Algún texto nuevo");

Steve Perks
fuente
El prototipo tiene funciones de utilidad similares.
ceejayoz
1

Utilice innerText si no puede asumir la estructura: use los datos de Text # para actualizar la prueba de rendimiento de texto existente

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

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}
Hollystyles
fuente
Es mejor reemplazar el nodo que eliminarlo y agregar uno nuevo como dos operaciones separadas.
Quentin
0

Aquí hay una manera fácil de jQuery :

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

el.html(el.html().replace(/Old Text/ig, "New Text"));
Cosmin
fuente
Esto parece una mala idea: ¿qué sucede si su elemento contiene subnodos con el mismo texto o si su texto coincide con parte del nombre de la etiqueta de un elemento? ¿Por qué no solo usar .text?
James Westgate
Estoy completamente de acuerdo con James Westgate, no debería hacer eso.
TGarrett
0

En HTML pon esto

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

En Javascript pon esto

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