</script>
musi zostać rozbity, ponieważ w przeciwnym razie <script></script>
zbyt wcześnie zakończyłby blok otaczający . Naprawdę powinien być podzielony na <
i /
, ponieważ blok skryptu powinien (zgodnie z SGML) być zakończony dowolną sekwencją otwartego znacznika końcowego (ETAGO) (tj. </
) :
Chociaż elementy STYLE i SCRIPT używają CDATA w swoim modelu danych, w przypadku tych elementów CDATA musi być obsługiwany w inny sposób przez aplikacje klienckie. Znaczniki i jednostki muszą być traktowane jako nieprzetworzony tekst i przekazywane do aplikacji w niezmienionej postaci. Pierwsze wystąpienie sekwencji znaków „ </
” (otwarty separator znacznika końcowego) jest traktowane jako zakończenie końca zawartości elementu. W prawidłowych dokumentach byłby to znacznik końcowy elementu.
Jednak w praktyce przeglądarki kończą tylko parsowanie bloku skryptu CDATA na rzeczywistym </script>
tagu close.
W XHTML nie ma takiej specjalnej obsługi bloków skryptów, więc każdy <
(lub &
) znak w nich musi być &escaped;
taki sam jak w każdym innym elemencie. Jednak przeglądarki, które analizują XHTML jako oldschoolowy HTML, będą się mylić. Istnieją obejścia dotyczące bloków CDATA, ale najłatwiej jest po prostu uniknąć używania tych znaków bez zmian. Lepszym sposobem napisania elementu skryptu ze skryptu, który działa na dowolnym parserze, jest:
<script type="text/javascript">
document.write('\x3Cscript type="text/javascript" src="foo.js">\x3C/script>');
</script>
\/
jest prawidłową sekwencją zmiany znaczenia/
, więc dlaczego po prostu jej nie użyć zamiast tych literowych znaków ucieczki<
? Npdocument.write('<script src=foo.js><\/script>');
. Ponadto</script>
nie jest to jedyna sekwencja znaków, która może zamknąć<script>
element. Więcej informacji tutaj: mathiasbynens.be/notes/etago<\/script>
w tym przypadku jest w porządku, ale działałoby tylko w HTML; w XHTML bez dodatkowego owijania sekcji CDATA jest to nadal dobrze sformułowany błąd. Możesz także użyć\x3C
wbudowanych atrybutów obsługi zdarzeń gdzie<
byłyby niepoprawne zarówno w HTML, jak i XHTML, więc ma szersze zastosowanie: gdybym wybrał jeden, łatwo zautomatyzowany sposób na ucieczkę wrażliwych znaków w literałach ciągów JS dla wszystkich kontekstów, to jest to ten, na który bym poszedł.<
można go używać w atrybutach wbudowanej procedury obsługi zdarzeń. html5.validator.nu/… I masz rację co do kompatybilności\x3C
sich z XHTML , ale ponieważ XHTML nie obsługujedocument.write
(lubinnerHTML
) i tak nie wiem, jak to jest istotne.document.write
ma znaczenia, po prostu jest przykładem. OP mógł użyć innerHTML, chodzi o ukrywanie ukrywania</
sekwencji znaków przed parserem znaczników, gdziekolwiek się pojawi. Po prostu większość parserów toleruje to w elemencie skryptu, gdy ściśle tego nie powinno (ale parsery HTML są bardzo tolerancyjne). Masz rację, ale<\/
we wszystkich przypadkach wystarczy HTML.document.write('<script src="foo.js">\x3C/script>')
wydaje się wystarczająca we wszystkich przeglądarkach z powrotem do IE6. (Pominąłem atrybut type, ponieważ nie jest wymagany w HTML5, ani nie jest egzekwowany zgodnie z wymaganiami jakiejkolwiek przeglądarki).Oto kolejna odmiana, której użyłem, gdy chcę wygenerować znacznik skryptu w wierszu (więc wykonuje się on natychmiast) bez potrzeby stosowania jakichkolwiek znaków zmiany znaczenia:
(Uwaga: w przeciwieństwie do większości przykładów w sieci, nie ustawiam
type="text/javascript"
ani tagu zamykającego, ani generowanego: nie ma przeglądarki, która nie ma tej wartości domyślnej, więc jest redundantna, ale też nie zaszkodzi, jeśli się nie zgadzasz).źródło
Myślę, że ma to na celu zapobieganie interpretacji przez parser HTML HTML <script>, a przede wszystkim </script> jako znacznika zamykającego rzeczywistego skryptu, jednak nie sądzę, że użycie document.write to doskonały pomysł na ocenę skryptu bloki, dlaczego nie użyć DOM ...
źródło
Rozwiązanie, które opublikował Bobince, działa dla mnie idealnie. Chciałem zaoferować alternatywną metodę również przyszłym użytkownikom:
W tym przykładzie uwzględniłem ładowanie warunkowe dla jQuery, aby zademonstrować przypadek użycia. Mam nadzieję, że jest to przydatne dla kogoś!
źródło
</script>
Wewnątrz łańcucha litteral JavaScript jest interpretowany przez parser HTML jako znacznika zamykającego, powodując nieoczekiwane zachowanie ( patrz przykład na JSFiddle ).Aby tego uniknąć, możesz umieścić javascript między komentarzami (ten styl kodowania był powszechną praktyką, kiedy JavaScript był słabo obsługiwany przez przeglądarki). To działałoby ( patrz przykład w JSFiddle ):
... ale szczerze mówiąc, używanie
document.write
nie jest czymś, co uważam za najlepszą praktykę. Dlaczego nie manipulować bezpośrednio DOM?źródło
append
zamiastappendChild
. Poprawiłem odpowiedź. Dziękujemy za zauważenie!