2009-11-02 14 views
33

Występuje problem polegający na tym, że kończę tag skryptu wewnątrz cytowanego ciągu znaków w JavaScript i zabijam skrypt. Zakładam, że to nie jest oczekiwane zachowanie. Przykład tego można zobaczyć tutaj: http://jsbin.com/oqepe/editZnacznik skryptu w łańcuchu JavaScript

Moja przeglądarka przypadków testowych dla zainteresowanych: Mozilla/5.0 (X11; U; Linux i686; en-US; rv: 1.9.1.4) Gecko/20091028 Ubuntu/9.10 (karmic) Firefox/3.5.4.

Odpowiedz

64

Co się dzieje?

Przeglądarka HTML przeglądarki zobaczy w ciągu napis </script> i zinterpretuje go jako koniec elementu skryptu.

Spójrz na kolorowanie składni tego przykładu:

<script> 
var test = 'foo... </script> bar.....'; 
</script> 

zauważyć, że słowo bar jest traktowana jako zawartość tekstu zewnętrznego elementu skryptu ...

Powszechnie stosowaną techniką jest aby użyć operatora konkatenacji:

var test = '...... </scr'+'ipt>......'; 
+3

To działa, ale jestem zaskoczony, że muszę to zrobić. Część problemu polega na tym, że skrobię stronę i zapisuję wyniki w zmiennej JS. Nie mam żadnych rzeczywistych oczekiwań co do tego, co powróci. – re5et

+0

W jaki sposób przechowujesz go w zmiennej? Czy skrobanie po stronie serwera generuje 'var x = ;'? Jeśli tak, nie zapomnij o kodowaniu JSON. – orip

+12

Escape the /, nie rozdzielaj łańcucha na części. IIRC nadal jest błędem w HTML 4.x. Z pewnością jest to bardziej skomplikowany typ, bardziej czytelny w czytaniu, więcej postaci do radzenia sobie i mniej wydajny (ponieważ konkatenacja ciągów nie jest najtańszą z operacji JS). – Quentin

11

Musisz uciec, inaczej będzie częścią HTML.

var test = 'what the hell... \<\/script\> \<h1\>why?!?!?!\<\/h1\>'; 
+5

jest to niepoprawne. jest to zmienna przechowująca tekst. Nie jest wstawiany do kodu HTML. Używanie tagu innego niż skrypt nie przyniesie takich samych rezultatów. – re5et

+0

Jest to sposób renderowania XML. Możesz również zawinąć skrypt za pomocą . Nie stanie się tak z innymi tagami, ponieważ działa parser XML (w szczególności traktuje skrypt jako tekst, a nie jako kod). – LiraNuna

+1

@LiraNuna Umm. Nie. Analizator składni XML traktuje "" jako "Koniec skryptu" i "" jako błąd związany z poprawnym formatowaniem. Analizator składni HTML traktuje "" jako "koniec skryptu", a następnie, jeśli jest "" jako "Błąd z obsługą niezdefiniowaną przez specyfikację". Tylko parser zupa tagów (i prawdopodobnie parser HTML5, nie przeczytałem wystarczająco dokładnie wersji) będzie traktował "" jako część skryptu. – Quentin

Powiązane problemy