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

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

Questo frammento di javascript restituisce semplicemente una stringa vuota. C'è un modo per ottenere il contenuto di un nodo noscript?Accesso contenuto di <noscript> con Javascript

p.s. Sto usando il prototipo su questo particolare progetto.

+1

Prova $ ($ ("noscript"). Testo()) con jQuery. – sibidiba

+0

Questo^funziona. Almeno in Chrome 32. – Jazzy

risposta

12

Se lo script è abilitato, the noscript element is defined as containing only text - anche se deve essere parsabile testo, con alcune restrizioni sul contenuto. Con questo in mente, dovresti essere in grado di estrarre il testo, analizzarlo e quindi trovare l'elemento desiderato. Un esempio rudimentale di questo segue:

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

Nota che quando ho originariamente scritto questa risposta, quanto sopra non è riuscito in Google Chrome; l'accesso al contenuto di noscript sembra essere un po 'meglio supportato al giorno d'oggi, ma mi sembra ancora un caso limite che è forse più probabile di altri bug per mostrare bug - lo eviterei se hai altre opzioni.

+0

Sembra non funzionare su IE7 (XP). Io lavoro su IE6, però. – pixelastic

+1

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

+0

@ Shog9 Tutto questo tempo dopo, potresti chiarire qualcosa su questa risposta? 'in Google Chrome, l'elemento noscript non ha figli nel DOM' - se ho capito bene, stai dicendo che la versione di Chrome che stavi testando al momento svuotava completamente il contenuto dei tag' noscript' quando Javascript era abilitato, rendendo così vuoti i suoi contenuti interiori? Se è vero, sembra un po 'strano.Sto cercando di implementare qualcosa di simile oggi, ma questo mi chiede se la specifica 'noscript' non elabora cosa fare con il suo contenuto. –

3

Test con Firefox 3.0.7, Safari 3.2.2 e MSIE 7.0.5730.13 (tutto su WinXP SP3) sembra che tutto all'interno dei tag <noscript> sia completamente omesso dall'albero DOM.

Potrebbe essere possibile accedere allo stesso elemento <noscript>, quindi utilizzare i metodi DOM per modificare i suoi elementi figli.

+0

Non ho provato gli altri due, ma FF3.0.7 espone il contenuto tramite textContent. – Shog9

3

Dal HTML 4.0 spec:

L'elemento NOSCRIPT permette agli autori di fornire contenuto alternativo quando uno script non viene eseguito. Il contenuto di un elemento NOSCRIPT deve essere visualizzato da uno user agent che riconosce gli script nei seguenti casi:

  • L'agente utente è configurato per non valutare gli script.
  • L'agente utente non supporta un linguaggio di script richiamato da un elemento SCRIPT in precedenza nel documento.

Mi sembra che questo implica che l'intero contenuto del tag NOSCRIPT (in questo caso, il tuo div) vengono ignorati del tutto, se gli script è attivato nel browser. Hai verificato che il div "example" è accessibile attraverso il DOM nel tuo caso?

+0

L'ho effettivamente testato (vedi la mia risposta) - il div non è nel DOM. – Alnitak

3

io non sono sicuro di prototipo, ma questo funziona in Chrome con jQuery: (. $ ("Noscript") del testo())

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

L'ho usato con successo con IE9, FF9 e Chrome 16.0.912.77. Devo utilizzare un work-around per IE8 (e forse anche prima), nel mio caso, per recuperare il contenuto dell'URL corrente tramite AJAX da inserire in una scheda dell'interfaccia utente jQuery poiché l'effettivo contenuto a schede di un URL non-root viene pubblicato in un tag noscript per impostazione predefinita per una richiesta completa, solo il contenuto della scheda su una richiesta AJAX. – tvanfosson

2

Prova $ con jQuery.

+0

È interessante e utile per recuperare il testo normale. ma Sizzle (1.9.1) genera un errore di "espressione non riconosciuta" se si tenta di recuperare qualsiasi markup con i tag. – Ben