usuario105033
si tengo un durardecir:
<span id="myspan"> hereismytext </span>
¿Cómo uso JavaScript para cambiar “hereismytext” a “newtext”?
gregorio
Para los navegadores modernos, debe usar:
document.getElementById("myspan").textContent="newtext";
Si bien es posible que los navegadores más antiguos no sepan textContent
no se recomienda su uso innerHTML
ya que presenta una vulnerabilidad XSS cuando el nuevo texto es ingresado por el usuario (vea otras respuestas a continuación para una discusión más detallada):
//POSSIBLY INSECURE IF NEWTEXT BECOMES A VARIABLE!!
document.getElementById("myspan").innerHTML="newtext";
-
@bouncingHippo document.getElementById(“myspan”).setAttribute(“style”,”cssvalues”);
– Gregorio
11 de septiembre de 2012 a las 6:44
-
debería haber alguna forma de fusionar esas dos respuestas en una sola. es exactamente la misma respuesta.
– john-jones
18 de febrero de 2014 a las 11:47
-
Esto no establece el textoestablece el HTML que es fundamentalmente diferente.
– brad
11 de octubre de 2014 a las 2:05
-
@gregoire: como otros ya han señalado, su respuesta es vulnerable a XSS. Esta pregunta ya se ha visto unas 80 000 veces, lo que significa que muchas personas probablemente se han hecho cargo de esta solución y podrían haber introducido filtraciones xss innecesarias. ¿Podría considerar actualizar su respuesta para usar
textContent
en cambio, de manera que se anime a la gente nueva a usar métodos adecuados y seguros?– tido
20 de enero de 2015 a las 21:59
-
@Tiddo textContent no es compatible con IE8 y versiones anteriores, y espero que nunca use directamente una entrada de usuario no desinfectada en su secuencia de comandos.
– Gregorio
21 de enero de 2015 a las 11:20
nicooo.
Usando HTML interno es TAN NO RECOMENDADO. En su lugar, debe crear un textNode. De esta manera, está “vinculando” su texto y no es, al menos en este caso, vulnerable a un ataque XSS.
document.getElementById("myspan").innerHTML = "sometext"; //INSECURE!!
La direccion correcta:
span = document.getElementById("myspan");
txt = document.createTextNode("your cool text");
span.appendChild(txt);
Para más información sobre esta vulnerabilidad:
Secuencias de comandos entre sitios (XSS) – OWASP
Editado el 4 de noviembre de 2017:
Se modificó la tercera línea de código según la sugerencia de @mumush: “use appendChild(); en su lugar”.
Por cierto, según @Jimbo Jonny, creo que todo debe tratarse como entrada del usuario aplicando el principio de seguridad por capas. Así no te encontrarás con sorpresas.
-
Si bien tienes toda la razón sobre
innerHTML
requiere precaución, tenga en cuenta que su solución utilizainnerText
que no es compatible con Firefox. quirksmode.org/dom/html también usatextContent
que no es compatible con IE8. Puede estructurar el código para sortear estos problemas.– Trot
2 oct 2014 a las 15:48
-
Usar
span.appendChild(txt);
¡en cambio!– mumush
03/09/2015 a las 17:53
-
La pregunta no dice nada sobre la entrada del usuario, por lo que es una declaración general de que
innerHTML
No es recomendable es ridículo. Sin mencionar que todavía está bien una vez desinfectado. La idea de que uno debe desinfectar la entrada del usuario es TAN NO RELACIONADO a esta pregunta específica. A lo sumo merece una pequeña nota al final que diga “por cierto: si es una entrada del usuario, asegúrese de desinfectar primero o use el método X que no lo necesita”.-Jimbo Jonny
23/01/2016 a las 20:30
-
Usar appendChild en realidad no cambiar el texto, sólo se suma a él. Usando su código aquí, el lapso de la pregunta original terminaría leyendo “hereismytextyour cool text”. Tal vez
span.innerHTML = "";
entonces appendChild?– Shane Sauce
9 mayo 2018 a las 16:45
-
@JimboJonny Cuando se habla de preguntas como esta que se han visto más de 650,000 veces, lo que pregunta específicamente el OP es completamente irrelevante. Por lo tanto, creo que es prudente mencionar la vulnerabilidad XSS de manera destacada, en interés de la seguridad pública.
– sí22
16 de marzo de 2021 a las 7:14
trote
EDITAR: Esto fue escrito en 2014. Mucho ha cambiado. Probablemente ya no te importe IE8. Y Firefox ahora es compatible innerText
.
Si usted es el que proporciona el texto y el usuario (o alguna otra fuente que no controla) no proporciona ninguna parte del texto, entonces establezca innerHTML
podría ser aceptable:
// * 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';
Sin embargo, como otros señalan, si no es la fuente de ninguna parte de la cadena de texto, al usar innerHTML
puede someterlo a ataques de inyección de contenido como XSS si no tiene cuidado de desinfectar correctamente el texto primero.
Si está utilizando la entrada del usuario, aquí hay una forma de hacerlo de forma segura y al mismo tiempo mantener la compatibilidad entre navegadores:
var span = document.getElementById('myspan');
span.innerText = span.textContent="newtext";
Firefox no es compatible innerText
e IE8 no es compatible textContent
por lo tanto, debe usar ambos si desea mantener la compatibilidad entre navegadores.
Y si quiere evitar reflujos (causados por innerText
) donde sea posible:
var span = document.getElementById('myspan');
if ('textContent' in span) {
span.textContent="newtext";
} else {
span.innerText="newtext";
}
-
Actualización de 2022: para las personas que puedan encontrar esta respuesta, ahora
innerText
es compatible con Firefox ver el estado de Caniuse. Entonces solo puedes usarinnerText
. Y también consulte el documento de MDM para ver las diferencias entreinnerText
ytextContent
.– Ben Souchet
8 de marzo de 2022 a las 12:36
-
@BenSouchet Gracias. Actualicé la advertencia que inicia la respuesta para incluir la información de Firefox. Siéntase libre de editar más si cree que sería útil proporcionar información adicional y/o enlaces a la gente.
– Trot
8 de marzo de 2022 a las 14:21
Dan
document.getElementById('myspan').innerHTML = 'newtext';
yo suelo Jquery
y nada de lo anterior ayudó, no sé por qué, pero esto funcionó:
$("#span_id").text("new_value");
Aquí hay otra manera:
var myspan = document.getElementById('myspan');
if (myspan.innerText) {
myspan.innerText = "newtext";
}
else
if (myspan.textContent) {
myspan.textContent = "newtext";
}
Safari, Google Chrome y MSIE detectarán la propiedad innerText. Para Firefox, la forma estándar de hacer las cosas era usar textContent, pero desde la versión 45 también tiene una propiedad innerText, como alguien amablemente me informó recientemente. Esta solución comprueba si un navegador admite alguna de estas propiedades y, de ser así, asigna el “texto nuevo”.
Demo en vivo: aquí
mohamed nagieb
Además de las respuestas de javascript puras anteriores, puede usar jQuery texto método de la siguiente manera:
$('#myspan').text('newtext');
Si necesita extender la respuesta para obtener/cambiar html contenido de un elemento span o div, puede hacer esto:
$('#mydiv').html('<strong>new text</strong>');
Referencias:
.texto(): http://api.jquery.com/text/
.html(): http://api.jquery.com/html/