2009-03-06 27 views
15
<noscript><div id="example">I want to get this innerHTML</div></noscript> 

<script type="text/javascript"> alert($('example').innerHTML);</script> 

Este fragmento de javascript simplemente devuelve una cadena vacía. ¿Hay alguna forma de obtener los contenidos de un nodo noscript?Acceso a los contenidos de <noscript> con Javascript

p.s. Estoy usando un prototipo en este proyecto en particular.

+1

Pruebe $ ($ ("noscript"). Text()) con jQuery. – sibidiba

+0

Esto^funciona. Al menos en Chrome 32. – Jazzy

Respuesta

12

Si la creación de scripts está habilitada, the noscript element is defined as containing only text - aunque debe ser , con algunas restricciones de contenido. Con eso en mente, debería ser capaz de extraer el texto, analizarlo y luego encontrar el elemento deseado. Un ejemplo rudimentario de esto sigue:

var nos = document.getElementsByTagName("noscript")[0]; 
// in some browsers, contents of noscript hang around in one form or another 
var nosHtml = nos.textContent||nos.innerHTML; 

if (nosHtml) 
{ 
    var temp = document.createElement("div"); 
    temp.innerHTML = nosHtml; 

    // lazy man's query library: add it, find it, remove it 
    document.body.appendChild(temp); 
    var ex = document.getElementById("example"); 
    document.body.removeChild(temp); 

    alert(ex.innerHTML); 
} 

Tenga en cuenta que cuando escribí originalmente esta respuesta, lo anterior falló en Google Chrome; el acceso al contenido de noscript parece estar un poco mejor respaldado en estos días, pero todavía me parece un caso marginal que quizás sea un poco más probable que otros elementos muestren errores; lo evitaría si tuviera otras opciones.

+0

Esto no parece funcionar en IE7 (XP). Aunque trabajo en IE6. – pixelastic

+1

Pruebe $ ($ ("noscript"). Text()) con jQuery. – sibidiba

+0

@ Shog9 Todo este tiempo más tarde, ¿podría aclarar algo acerca de esta respuesta? 'en Google Chrome, el elemento noscript no tiene hijos en el DOM' - si entiendo esto correctamente, ¿estás diciendo que la versión de Chrome que estabas probando en ese momento vaciaba por completo el contenido de las etiquetas' noscript' cuando JavaScript estaba habilitado, por lo tanto, ¿deja vacío su contenido interno? Si es cierto, parece un poco extraño.Estoy tratando de implementar algo similar hoy, pero esto me hace preguntarme si la especificación 'noscript' no explica qué hacer con sus contenidos. –

3

Probando con Firefox 3.0.7, Safari 3.2.2, y MSIE 7.0.5730.13 (todo en WinXP SP3) parece que todo dentro de las etiquetas <noscript> se omite por completo del árbol DOM.

Sin embargo, es posible acceder al elemento <noscript>, y luego usar los métodos DOM para cambiar sus elementos secundarios.

+0

No intenté con los otros dos, pero FF3.0.7 expone el contenido a través de textContent. – Shog9

3

Desde el HTML 4.0 spec:

El elemento NOSCRIPT permite a los autores para proporcionar contenido alternativo cuando no se ejecuta una secuencia de comandos. El contenido de un elemento NOSCRIPT sólo debe ser prestado por un agente de usuario guión-cuenta en los siguientes casos:

  • El agente de usuario no está configurado para evaluar los scripts.
  • El agente de usuario no admite un lenguaje de scripts invocado por un elemento SCRIPT anteriormente en el documento.

Me parece que esto implica que todo el contenido de la etiqueta NOSCRIPT (en este caso, su div) se ignoran por completo si secuencias de comandos está habilitado en el navegador. ¿Has verificado que el div "ejemplo" es accesible a través del DOM en todo en tu caso?

+0

Lo he probado (ver mi respuesta) - el div no está en el DOM. – Alnitak

3

no estoy seguro sobre el prototipo, pero esto funciona en Chrome con jQuery: (. $ ("Noscript") texto())

$('noscript').before($('noscript').text()); 
+1

Lo he usado con éxito con IE9, FF9 y Chrome 16.0.912.77. Tengo que usar una solución alternativa para IE8 (y tal vez antes), en mi caso, recuperar el contenido en la URL actual a través de AJAX para insertarlo en la pestaña de la interfaz de usuario jQuery, ya que el contenido tabulado de una url no raíz se sirve en una etiqueta noscript por defecto para una solicitud completa, solo el contenido de la pestaña en una solicitud AJAX. – tvanfosson

2

Pruebe con jQuery $.

+0

Eso es interesante y útil para recuperar texto sin formato. pero Sizzle (1.9.1) arroja un error de "expresión no reconocida" si intenta recuperar cualquier marcado con etiquetas. – Ben

Cuestiones relacionadas