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

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

Dieser Javascript-Schnipsel gibt nur einen leeren String. Gibt es eine Möglichkeit, den Inhalt eines Noscript-Knotens zu erhalten?Zugang Inhalt von <noscript> mit Javascript

p.s. Ich verwende einen Prototyp für dieses spezielle Projekt.

+1

Probieren Sie $ ($ ("noscript"). Text()) mit jQuery. – sibidiba

+0

Das funktioniert. Zumindest in Chrome 32. – Jazzy

Antwort

12

Wenn Skripting aktiviert ist, the noscript element is defined as containing only text - obwohl es Parsable Text sein muss, mit einigen Einschränkungen für den Inhalt. In diesem Sinne sollten Sie in der Lage sein, den Text zu extrahieren, zu parsen und dann das gewünschte Element zu finden. Ein rudimentäres Beispiel dafür folgt:

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

Beachten Sie, dass, wenn ich diese Antwort ursprünglich geschrieben, die oben in Google Chrome ausgefallen ist; Der Zugriff auf noscript-Inhalte scheint heutzutage etwas besser unterstützt zu werden, aber es scheint mir immer noch ein Randfall zu sein, der vielleicht etwas wahrscheinlicher ist als andere Elemente, Bugs zu zeigen - ich würde es vermeiden, wenn Sie andere Möglichkeiten haben.

+0

Dies scheint nicht auf IE7 (XP) zu funktionieren. Ich arbeite jedoch an IE6. – pixelastic

+1

Versuchen Sie $ ($ ("noscript"). Text()) mit jQuery. – sibidiba

+0

@ Shog9 Konnten Sie die ganze Zeit später etwas über diese Antwort klären? "In Google Chrome hat das noscript-Element keine untergeordneten Elemente im DOM" - wenn ich das richtig verstehe, sagen Sie, dass die Version von Chrome, die Sie gerade getestet haben, den Inhalt der "noscript" -Tags vollständig entleert hat, wenn Javascript aktiviert war. wodurch seine inneren Inhalte leer werden? Wenn es wahr ist, scheint es ein bisschen seltsam.Ich versuche heute etwas Ähnliches zu implementieren, aber ich frage mich, ob die 'noscript'-Spezifikation nicht ausführt, was mit ihrem Inhalt zu tun ist. –

3

Testen mit Firefox 3.0.7, Safari 3.2.2 und MSIE 7.0.5730.13 (alle auf WinXP SP3) scheint, dass alles innerhalb der <noscript> Tags vollständig aus dem DOM-Baum weggelassen wird.

Es kann jedoch möglich sein, auf das Element <noscript> selbst zuzugreifen und dann DOM-Methoden zu verwenden, um seine untergeordneten Elemente zu ändern.

+0

Habe die anderen beiden nicht getestet, aber FF3.0.7 macht den Inhalt über textContent verfügbar. – Shog9

3

Vom HTML 4.0 spec:

Das NOSCRIPT Element ermöglicht Autoren alternativen Inhalt zu liefern, wenn ein Skript nicht ausgeführt wird. Der Inhalt eines NOSCRIPT-Elements sollte in den folgenden Fällen nur von einem skriptsensitiven Benutzeragenten gerendert werden:

  • Der Benutzeragent ist so konfiguriert, dass keine Skripts ausgewertet werden.
  • Der Benutzeragent unterstützt keine Skriptsprache, die zuvor von einem SCRIPT-Element aufgerufen wurde.

Es scheint mir, dass dies bedeutet, dass der gesamte Inhalt des NOSCRIPT-Tages (in diesem Fall Ihre div) vollständig ignoriert werden, wenn Scripting im Browser aktiviert ist. Haben Sie überprüft, dass das div "example" in Ihrem Fall überhaupt über das DOM zugänglich ist?

+0

Ich habe es tatsächlich getestet (siehe meine Antwort) - das Div ist nicht im DOM. – Alnitak

3

Ich bin nicht sicher über Prototyp, aber das funktioniert in Chrome mit jQuery: (. $ ("NoScript") Text())

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

Ich habe dies erfolgreich mit IE9, FF9 und Chrome 16.0.912.77 verwendet. Ich muss einen Workaround für IE8 (und vielleicht früher) verwenden, um den Inhalt der aktuellen URL über AJAX abzurufen, um ihn in eine jQuery UI-Registerkarte einzufügen, da der eigentliche Tabbed Content von einer Nicht-Root-URL bereitgestellt wird In einem Noscript-Tag standardmäßig für eine vollständige Anfrage, nur der Tab-Inhalt für eine AJAX-Anfrage. – tvanfosson

2

Versuchen $ mit jQuery.

+0

Das ist interessant und nützlich zum Abrufen von Klartext. aber Sizzle (1.9.1) löst einen "unerkannten Ausdruck" aus, wenn Sie versuchen, Markups mit Tags zu erhalten. – Ben