¿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
}

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

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

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

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.


¿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.


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.


7

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

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

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


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


El prototipo tiene funciones de utilidad similares.
ceejayoz


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

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

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

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';}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.