Tengo un código JavaScript que funciona en IE que contiene lo siguiente:
myElement.innerText = "foo";
Sin embargo, parece que la propiedad 'innerText' no funciona en Firefox. ¿Hay algún equivalente de Firefox? ¿O hay una propiedad de navegador cruzado más genérica que se puede usar?
Respuestas:
Firefox utiliza la propiedad textContent compatible con W3C .
Supongo que Safari y Opera también admiten esta propiedad.
fuente
innerText
es / será compatible con FF a partir de 2016.innerText
solo y esperar que funcione (con posibles peculiaridades) en todos los navegadores actuales en un futuro próximo, y también en IE antiguo.innerText
es profundamente diferente detextContent
, y en realidad es muy útil (sorprendentemente de una presunta peculiaridad de IE ...):innerText
intenta dar una aproximación de cómo se presenta realmente el texto en el navegador, totalmente diferentetextContent
, lo que devuelve casi la etiqueta fuente de marcado despojado , agregando poco valor, o incluso problemas adicionales (como la pérdida de límites de palabras).Actualización : escribí una publicación de blog detallando todas las diferencias mucho mejor.
Firefox usa el estándar W3C
Node::textContent
, pero su comportamiento difiere "levemente" del del propietario de MSHTMLinnerText
(copiado también por Opera, hace algún tiempo, entre docenas de otras características de MSHTML).En primer lugar, la
textContent
representación de espacios en blanco es diferente deinnerText
uno. En segundo lugar, y más importante,textContent
incluye todo el contenido de la etiqueta SCRIPT , mientras que innerText no.Solo para hacer las cosas más entretenidas, Opera, además de implementar el estándar
textContent
, decidió agregar también MSHTML,innerText
pero lo cambió para que actuaratextContent
, es decir, incluir contenidos SCRIPT (de hecho,textContent
yinnerText
en Opera parecen producir resultados idénticos, probablemente solo se alias entre sí) .textContent
es parte de laNode
interfaz, mientras queinnerText
es parte deHTMLElement
. Esto, por ejemplo, significa que puede "recuperar"textContent
pero noinnerText
desde nodos de texto:Finalmente, Safari 2.x también tiene una
innerText
implementación con errores . En Safari,innerText
funciona correctamente solo si un elemento no está oculto (víastyle.display == "none"
) ni huérfano del documento. De lo contrario,innerText
da como resultado una cadena vacía.Estaba jugando con la
textContent
abstracción (para solucionar estas deficiencias), pero resultó ser bastante complejo .Su mejor opción es definir primero sus requisitos exactos y seguir desde allí. A menudo es posible simplemente quitar las etiquetas
innerHTML
de un elemento, en lugar de tratar con todas las posiblestextContent
/innerText
desviaciones.Otra posibilidad, por supuesto, es recorrer el árbol DOM y recopilar nodos de texto de forma recursiva.
fuente
innerText
en Chrome. jsperf.com/text-content/3textContent
ahora es compatible con IE9 +, pero Firefox todavía no es compatibleinnerText
(aunque agregaron IE-introducido haceouterHTML
solo unos días).Node.textContent
cuña bastante completa en progreso aquí: github.com/usmonster/aight/blob/node-textcontent-shim/js/… (espero que pronto se incluya en aight ).innerText
es / será compatible con FF a partir de 2016.Si solo necesita configurar el contenido de texto y no recuperarlo, aquí hay una versión DOM trivial que puede usar en cualquier navegador; no requiere la extensión IE innerText o la propiedad DOM Level 3 Core textContent.
fuente
!==
operador, el inverso de===
. La comparación sensible al tipo utilizada por===
/!==
generalmente es preferible a los comparadores sueltos==
/!=
.!==null
por completo) en lugar de simplemente reemplazar el bucle conelement.innerHTML=''
(que está especificado para hacer exactamente el mismo trabajo que el bucle y luego recordé ... .: tablas en (legacy-) IE ... ericvasilik.com/2006/07/code-karma.html ¿Puedo sugerir agregar una breve descripción del ' efecto secundario' 'oculto' y casi nunca documentado decreateTextNode
reemplazar el amplificador? ? y gt a sus respectivas entidades de caracteres hTML Un enlace a su comportamiento exacto puede ser magnífica!jQuery proporciona un
.text()
método que puede usarse en cualquier navegador. Por ejemplo:fuente
Según la respuesta de Prakash K, Firefox no admite la propiedad innerText. Por lo tanto, simplemente puede probar si el agente de usuario admite esta propiedad y proceder en consecuencia de la siguiente manera:
fuente
Una línea realmente simple de Javascript puede obtener el texto "no etiquetado" en todos los navegadores principales ...
fuente
textContent
y cómoinnerText
informar espacios en blanco que pueden ser importantes para algunos casos de uso.||
, es decir:var myText = (myElement.innerText || myElement.textContent || "") ;
para superar el valor indefinido.Tenga en cuenta que la
Element::innerText
propiedad no contendrá el texto que ha estado oculto por el estilo CSS "display:none
" en Google Chrome (y también eliminará el contenido que ha sido enmascarado por otras técnicas de CSS (incluido el tamaño de fuente: 0, color: transparente y algunos otros efectos similares que hacen que el texto no se represente de manera visible).También se consideran otras propiedades CSS:
<br \>
que genera una nueva línea en línea también generará una nueva línea en el valor de innerText.Pero
Element::textContent
aún contendrá TODOS los contenidos de elementos de texto interno independientemente del CSS aplicado, incluso si son invisibles. Y no se generarán nuevas líneas o espacios en blanco adicionales en textContent, que simplemente ignora todos los estilos y la estructura y los tipos de elementos internos en línea / bloqueados o posicionados.Una operación de copiar / pegar usando la selección del mouse descartará el texto oculto en el formato de texto sin formato que se coloca en el portapapeles, por lo que no contendrá todo lo que contiene
textContent
, sino solo lo que está dentroinnerText
(después de la generación de espacios en blanco / nueva línea como se indicó anteriormente) .Ambas propiedades son compatibles con Google Chrome, pero su contenido puede ser diferente. Los navegadores más antiguos todavía se incluían en innetText, todo lo que ahora contiene textContent (pero su comportamiento en relación con la generación de espacios en blanco / líneas nuevas era inconsistente).
jQuery resolverá estas inconsistencias entre los navegadores utilizando el método ".text ()" agregado a los elementos analizados que devuelve mediante una consulta $ (). Internamente, resuelve las dificultades al mirar el DOM HTML, trabajando solo con el nivel de "nodo". Por lo tanto, devolverá algo que se parece más al contenido de texto estándar.
La advertencia es que este método jQuery no insertará espacios adicionales o saltos de línea que puedan ser visibles en la pantalla causados por subelementos (como
<br />
) del contenido.Si diseña algunos scripts para la accesibilidad y su hoja de estilo se analiza para la representación no auditiva, como los complementos utilizados para comunicarse con un lector Braille, esta herramienta debe usar el contenido de texto si debe incluir los signos de puntuación específicos que se agregan en tramos con estilo "display: none" y que normalmente se incluyen en las páginas (por ejemplo, para superíndices / subíndices), de lo contrario, el texto interno será muy confuso para el lector Braille.
Los textos ocultos por los trucos CSS ahora son generalmente ignorados por los principales motores de búsqueda (que también analizarán el CSS de sus páginas HTML, y también ignorarán los textos que no tienen colores contrastantes en el fondo) usando un analizador HTML / CSS y la propiedad DOM "innerText" exactamente como en los navegadores visuales modernos (al menos este contenido invisible no se indexará, por lo que el texto oculto no se puede usar como un truco para forzar la inclusión de algunas palabras clave en la página para verificar su contenido); pero este texto oculto todavía se mostrará en la página de resultados (si la página aún estaba calificada del índice para ser incluida en los resultados), utilizando la propiedad "textContent" en lugar del HTML completo para eliminar los estilos y scripts adicionales.
SI asigna texto sin formato en cualquiera de estas dos propiedades, esto sobrescribirá el marcado interno y los estilos aplicados (solo el elemento asignado mantendrá su tipo, atributos y estilos), por lo que ambas propiedades contendrán el mismo contenido . Sin embargo, algunos navegadores ya no respetarán la escritura en innerText, y solo le permitirán sobrescribir la propiedad textContent (no puede insertar marcado HTML al escribir en estas propiedades, ya que los caracteres especiales HTML se codificarán correctamente usando referencias de caracteres numéricos para aparecer literalmente , si luego lee la
innerHTML
propiedad después de la asignación deinnerText
otextContent
.fuente
innerText
. En mis pruebas, solo se ignoran "display: none" y "visibilidad: oculto".Editar (gracias a Mark Amery por el comentario a continuación): solo hágalo de esta manera si sabe más allá de una duda razonable que ningún código dependerá de verificar la existencia de estas propiedades, como (por ejemplo) jQuery . Pero si está utilizando jQuery, probablemente usaría la función "text" y haría $ ('# myElement'). Text ('foo') como muestran otras respuestas.
fuente
innerText
otextContent
para decidir cuál usar. Al establecer ambos en una cadena, hará que el código de otras personas que actúa sobre el elemento detecte por error que el navegador admite ambas propiedades; en consecuencia, ese código puede comportarse mal.innerText
se ha agregado a Firefox y debería estar disponible en la versión FF45: https://bugzilla.mozilla.org/show_bug.cgi?id=264412Se ha escrito un borrador de especificaciones y se espera que se incorpore al estándar de vida HTML en el futuro: http://rocallahan.github.io/innerText-spec/ , https://github.com/whatwg/html/issues/ 465
Tenga en cuenta que actualmente las implementaciones de Firefox, Chrome e IE son incompatibles. En el futuro, probablemente podamos esperar que Firefox, Chrome y Edge converjan mientras que el antiguo IE sigue siendo incompatible.
Ver también: https://github.com/whatwg/compat/issues/5
fuente
innerText
. SitextContent
es un respaldo aceptable y necesita admitir Fx antiguo, entonces úselo(innerText || textContent)
. Si desea una implementación idéntica en todos los navegadores, no creo que haya ningún polyfill específico para esto, pero algunos marcos (por ejemplo, jQuery) ya podrían implementar algo similar; consulte las otras respuestas en esta página.innerText
, es decir: el texto visible en una página, en Firefox> = 38 (para un complemento) Al menos, las<script>
etiquetas deben omitirse por completo. jQuery$('#body').text()
no funcionó para mí. Pero como solución alternativainnerText || textContent
está bien. Gracias.textContent
por ahora.¿Qué tal algo como esto?
** Necesitaba poner el mío en mayúscula.
fuente
Como en 2016 desde Firefox v45,
innerText
funciona en firefox, eche un vistazo a su soporte: http://caniuse.com/#search=innerTextSi desea que funcione en versiones anteriores de Firefox, puede usarlo
textContent
, que tiene mejor soporte en Firefox pero peor en versiones anteriores de IE : http://caniuse.com/#search=textContentfuente
Esta ha sido mi experiencia con
innerText
,textContent
,innerHTML
, y el valor:es decir, Internet Explorer, ff = firefox, ch = google chrome. nota 1: ff funciona hasta que se elimine el valor con retroceso - vea la nota de Ray Vega arriba. nota 2: funciona un poco en Chrome: después de la actualización no cambia, luego hace clic y vuelve a hacer clic en el campo y aparece el valor. Lo mejor del lote es
elem.value = changeVal
; que no comenté arriba.fuente
Solo volviendo a publicar los comentarios debajo de la publicación original. innerHTML funciona en todos los navegadores. Gracias stefita
myElement.innerHTML = "foo";
fuente
innerHTML
no es un reemplazo adecuado paratextContent
/ ainnerText
menos que pueda estar seguro de que el texto que está asignando no contiene ninguna etiqueta u otra sintaxis HTML. Para cualquier información proporcionada por el usuario, definitivamente no tiene esa garantía. Impulsar este enfoque sin esa advertencia es peligroso dado que puede conducir a agujeros de seguridad XSS . Con tantos enfoques seguros disponibles, no hay razón para considerar este..innerHTML
, su código se rompe y es potencialmente vulnerable a XSS. ¿Qué pasa si esa cadena es"<script>alert(1)</script>"
?<script>
etiqueta insertada a través deinnerHTML
no debe ejecutarse. Pero eso no protege a los navegadores más antiguos. Además, HTML5innerHTML
NO salvaguardaría, por ejemplo"<img src='x' onerror='alert(1)'>"
.encontré esto aquí:
fuente
textContent
forma nativa ? Es también digno de mención que desdeinnerText
ytextContent
tener diferentes comportamientos, el código anterior no es un fieltextContent
cuña - esto es potencialmente importante, pero no necesariamente obvio!También es posible emular el
innerText
comportamiento en otros navegadores:fuente
pre
s ya que duplicará las nuevas líneas. Sospecho que hay más errores aquí.