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

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

Ten fragment kodu JavaScript zwraca tylko pusty ciąg. Czy istnieje sposób na uzyskanie zawartości węzła noscript?Dostęp do zawartości <noscript> z Javascriptem

p.s. Używam prototypu w tym konkretnym projekcie.

+1

Wypróbuj $ ($ ("noscript"). Text()) z jQuery. – sibidiba

+0

To^działa. Przynajmniej w Chrome 32. – Jazzy

Odpowiedz

12

Jeśli włączono obsługę skryptów, the noscript element is defined as containing only text - chociaż musi być to tekst parsable, z pewnymi ograniczeniami dotyczącymi zawartości. Mając to na uwadze, powinieneś być w stanie wyodrębnić tekst, przeanalizować go, a następnie znaleźć pożądany element. Prymitywny przykładem następująco:

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

Zauważ, że kiedy pierwotnie napisał tę odpowiedź, powyższe nie powiodło się w Google Chrome; Dostęp do zawartości noscript wydaje się być nieco lepiej wspierany w tych dniach, ale nadal wydaje mi się, że jest to skrajna skrzynka, która jest prawdopodobnie bardziej prawdopodobna niż inne elementy do pokazywania błędów - uniknęłbym go, gdybyś miał inne opcje.

+0

To nie wydaje się działać na IE7 (XP). Pracuję jednak nad IE6. – pixelastic

+1

Wypróbuj $ ($ ("noscript"). Text()) z jQuery. – sibidiba

+0

@ Shog9 Cały ten czas później, czy mógłbyś wyjaśnić coś na temat tej odpowiedzi? "w Google Chrome element noscript nie ma dzieci w DOM" - jeśli rozumiem to poprawnie, czy mówisz, że wersja Chrome, którą testowałeś w momencie całkowitego opróżnienia zawartości znaczników 'noscript' przy włączonej obsłudze Javascript, w ten sposób czyniąc jego wewnętrzną zawartość pustą? Jeśli to prawda, wydaje się to dziwne.Próbuję dzisiaj zaimplementować coś podobnego, ale zastanawiam się, czy specyfikacja 'noscript' nie wyjaśnia, co zrobić z jej zawartością. –

3

Testowanie w Firefoksie 3.0.7, Safari 3.2.2 i MSIE 7.0.5730.13 (wszystko na WinXP SP3) wydaje się, że wszystko w tagach <noscript> zostało całkowicie pominięte w drzewie DOM.

Możliwe jest jednak uzyskanie dostępu do elementu <noscript>, a następnie użycie metod DOM do zmiany jego elementów podrzędnych.

+0

Nie próbowałem dwóch pozostałych, ale FF3.0.7 odsłania zawartość przez textContent. – Shog9

3

Z HTML 4.0 spec:

Element NOSCRIPT pozwala autorom zapewnić alternatywną zawartość, gdy skrypt nie jest wykonywany. Zawartość elementu NOSCRIPT powinna być renderowana tylko przez klienta obsługującego skrypt w następujących przypadkach:

  • Agent użytkownika jest skonfigurowany tak, aby nie oceniał skryptów.
  • Agent użytkownika nie obsługuje języka skryptowego wywoływanego przez element SCRIPT we wcześniejszej części dokumentu.

Wydaje mi się, że oznacza to, że cała zawartość znacznika NOSCRIPT (w tym przypadku, twój div) są całkowicie ignorowane jeśli skryptowy jest włączona w przeglądarce. Czy zweryfikowałeś, że "przykładowy" element div jest dostępny przez DOM w twoim przypadku?

+0

Ja faktycznie przetestowałem to (zobacz moją odpowiedź) - div nie jest w DOM. – Alnitak

3

nie jestem pewien o prototypie, ale to działa w Chrome z jQuery (. $ ("Noscript") tekst())

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

Użyłem tego z powodzeniem w IE9, FF9 i Chrome 16.0.912.77. Muszę użyć obejścia dla IE8 (i być może wcześniej), w moim przypadku, aby pobrać zawartość pod bieżącym adresem URL za pośrednictwem AJAX, aby wstawić ją do zakładki jQuery UI, podczas gdy rzeczywiste treści z kartami z adresu URL innego niż root są wyświetlane w tagu noscript domyślnie dla pełnego żądania, tylko zawartość karty w żądaniu AJAX. – tvanfosson

2

Spróbuj $ z jQuery.

+0

To interesujące i użyteczne przy pobieraniu zwykłego tekstu. ale Sizzle (1.9.1) zgłasza błąd "nierozpoznanego wyrażenia", jeśli spróbujesz pobrać dowolny znacznik z tagami. – Ben

Powiązane problemy