gratis - ¿Cómo obtener el contenido de<noscript> en Javascript en IE7?
noscript chrome (9)
En IE 7 y 8, es simplemente imposible recuperar el contenido de un elemento <noscript>
. Cualquier contenido entre las <noscript>
y </noscript>
en el HTML no se refleja en el DOM en IE, el elemento no tiene hijos y innerHTML
y innerText
son cadenas vacías.
En IE 6, la situación es curiosa: en común con IE 7, el elemento <noscript>
no tiene nodos secundarios, pero su contenido se refleja en las outerHTML
innerHTML
y outerHTML
(pero no innerText
) del elemento.
Siendo este el caso, su única opción en IE es colocar el contenido en su elemento <noscript>
dentro de algún otro elemento en su lugar. Para emular el comportamiento de un elemento <noscript>
, puede colocar el contenido en un elemento que está inmediatamente oculto por JavaScript (cuando el script está habilitado):
<div id="noscript">Lorem ipsum</div>
<script type="text/javascript">
document.getElementById("noscript").style.display = "none";
</script>
Estoy tratando de obtener el contenido de una etiqueta <noscript>
usando Javascript. Logré con éxito conseguirlo en FF, Chrome, Opera e incluso IE6, pero fallaron en IE7 (aún no he probado IE8 +).
Básicamente, aquí está la versión de código reducido:
<noscript>Lorem ipsum</noscript>
<script>
var noscript = document.getElementsByTagName(''noscript'')[0];
noscript.textContent; // undefined
noscript.innerHTML; // empty string
noscript.childNodes.length; // 0
</script>
Intenté agregar elementos dentro y apuntándolos, sin éxito. Intenté envolver un elemento padre y obtener su .innerHTML
, pero se descarta cualquier cosa entre las etiquetas <noscript>
.
Nota: estoy creando un script de carga lenta y el elemento <noscript>
es justo lo que necesito ( <img>
src
atributos dentro de una etiqueta <noscript>
no son <noscript>
por el navegador).
Estás consultando los elementos del script en lugar de los elementos de noscript, esto funciona en todos los navegadores:
<noscript>Lorem ipsum</noscript>
<script>
var noscript = document.getElementsByTagName(''noscript'')[0];
alert(noscript.innerHTML); // Lorem ipsum
</script>
Este es un truco muy sucio y no ha sido probado, pero tuve la idea: D
Podría hacer lo que otros han sugerido, poner el contenido en un div en lugar de un noscript, y además de ocultarlo, elimine inmediatamente el atributo src
de todas las etiquetas img
utilizando algo como:
jQuery(function () {
jQuery(''div#noscript img'').attr(''src'', '''');
});
Esto debería limitar (pero no eliminar) la obtención de imágenes.
Esto es solo un comentario basado en los comentarios y las sugerencias de otros, espero que ayude.
Editar - otro truco sucio que acabo de pensar, que asume que puedes cambiar el lugar donde vive el html, por lo que puede o no ser relevante:
Dentro del noscript tenemos una
<iframe width="100%" height="100%" src="?noscript=true" />
entonces puede XMLHttpRequest
para el contenido de noscript ...
No es la solución más elegante: las imágenes se cargan normalmente con IE7 e IE8, y todos los demás navegadores obtienen el beneficio adicional de la carga lazi. Terminarás con algunos bloques de comentarios vacíos en la salida final ... pero a quién le importa, ¿verdad?
<!--[if (gt IE 8)|!(IE)]><!--><noscript><!--<![endif]-->
<img src="/path/to/img.jpg" alt="photo" />
<!--[if (gt IE 8)|!(IE)]><!--></noscript><!--<![endif]-->
JavaScript (jQuery - si necesita JS real, hágamelo saber):
jQuery(function($) {
$(''noscript'').each(function() {
var $this = $(this);
$this.replaceWith($this.text());
});
});
Probado con IE7 +, Chrome, FF3.6 +, Opera11
No tengo un navegador, es decir, en este momento;) pero, por lo que recuerdo, el contenido de una etiqueta <noscript>
está disponible cuando obtiene la etiqueta primaria .innerHTML()
. Luego, depende de usted sacarla (con una expresión regular desagradable, por ejemplo)
No puedo probarlo durante al menos 7 horas a partir de ahora, así que publico esta información como está.
PD. Mi consejo es rediseñar. Las etiquetas de Noscript contienen elementos que NO se usan cuando los scripts están activados.
Puede acceder a la propiedad textContent de la etiqueta textContent
en la mayoría de los navegadores modernos. Para los navegadores más antiguos, he escrito un polyfill que se ejecuta con bastante rapidez y en todos los navegadores de escritorio y móviles que podría probar.
Vea la publicación del blog: http://queryj.wordpress.com/2012/07/06/read-noscript-tag-content-reliably-in-all-browsers/
Vea el código (licencia doble bajo las licencias MIT y GPL): https://github.com/jameswestgate/noscript-textcontent/
EDITAR:
La secuencia de comandos funciona recargando la página a través de una solicitud ajax (que debe estar almacenada en caché en el navegador) y analizando los contenidos manualmente para los navegadores que no admiten la propiedad textContent
Tú podrías
<script>document.write(''<script id="images" type="text/html">'')</script>
Justo antes de las imágenes y luego
<script>document.write(''</scr''+''ipt>'')</script>
después de. Tendría las imágenes disponibles sin javascript, y con JavaScript allí, tendría sus fuentes a su disposición en $ (''imágenes''). InnerHTML
Tengo un enfoque diferente, con un ejemplo de trabajo aquí: https://github.com/jokeyrhyme/noscript.js/blob/c104c480b595278e9d559aaf8a26668b7c852f72/noscript.js#L25
Mi enfoque es simple:
- realice un XHR para descargar una copia en bruto del HTML original
- encontrar todos los elementos de noscript en el DOM
- Encuentra todos los elementos de noscript en el HTML original.
- Reemplace los noscripts de DOM con el contenido de los noscripts originales.
Mi método noscript.show()
prueba si esto es necesario primero. Para la mayoría de los navegadores, simplemente mueve el contenido de los elementos de noscript para que sean visibles.
Los usuarios que están atascados con estos terribles navegadores probablemente no tienen otra opción, y probablemente estén acostumbrados a tener una experiencia lenta, por lo que una solicitud de red adicional y algunas expresiones regulares no serán tan malas.
Nota: debido a la regla del mismo origen, es posible que tenga problemas para usar esta técnica al explorar archivos en su disco local a través del file:///...
, por lo que es probable que funcione solo cuando se navega a través de http://...
o https://...
Una solución alternativa para esto es duplicar el contenido de noscript como su atributo.
Por ejemplo:
<noscript id="ns" alt="Lorem ipsulum">Lurem ipsulum</noscript>
En el script, obtenga el valor del atributo alt en lugar de su innerHTML
<script>
var ns = document.getElementByid(''ns'');
var htm = ns.innerHTML || ns.getAttribute(''alt'');
alert(htm);
</script>