2010-11-19 12 views
14
<script type="text/javascript"> 
    function test() { 
     alert('&lt;span&gt;blah&lt;span&gt;'); 
    } 
</script> 
<a href="#" onclick="test();">First</a><br /> 
<a href="#" onclick="alert('&lt;span&gt;blah&lt;span&gt;');">Second</a><br /> 
Third: &lt;span&gt;blah&lt;span&gt; 

Demo: http://jsfiddle.net/LPYTZ/Znaczniki HTML w tagach skryptów nie są konwertowane?

Dlaczego to pierwszy wynik inaczej? Czy znaczniki <script> są w jakiś sposób wyłączone z konwersji encji?

Odpowiedz

21

W języku HTML elementy skryptu i stylu to defined in the DTD as containing CDATA. Oznacza to, że elementy i znaczniki są ignorowane, dopóki parser nie trafi w coś, co wygląda jak znacznik końcowy.

XHTML is different Elementy i znaczniki wewnątrz tych elementów działają normalnie, ale tylko wtedy, gdy są analizowane jako XHTML. Możesz jawnie oznaczać zawartość jako CDATA za pomocą <![CDATA[ … ]]>.

Przeglądarki będą traktować XHTML jako tekst/HTML przy użyciu reguł HTML, co prowadzi do wielkiej brzydkiej kuli podczas próby napisania kodu, który jest poprawny w obu zestawach zasad.

Najprostszym sposobem uniknięcia problemów jest przechowywanie skryptów w plikach zewnętrznych i stosowanie atrybutu src.

+0

+1 Za wzmiankę o XHTML. – Gumbo

+0

Jak już * miałem * XHTML (w jsfiddle też) +1 dla "Przeglądarki będą traktować XHTML służył jako tekst/html przy użyciu reguł HTML" część. – AndreKR

+0

@AndreKR: Ważny jest typ mediów MIME, a nie treść. – Gumbo

10

Tak, content model of STYLE and SCRIPT jest wyjątkowy:

Chociaż STYLE i SCRIPT elementy użyć CDATA dla ich modelu danych, dla tych elementów, CDATA muszą być traktowane inaczej przez agentów użytkownika. Oznaczenia i podmioty muszą być traktowane jako nieprzetworzony tekst i przekazywane do aplikacji w niezmienionej postaci. Pierwsze wystąpienie sekwencji znaków "</" (ogranicznik otwarcia znacznika końcowego) jest traktowane jako zakończenie końca zawartości elementu. W poprawnych dokumentach będzie to końcowy tag dla elementu.

Powiązane problemy