2009-09-24 17 views
19

Widziałem to na każdym Yahoo! news page, na dole kodu źródłowego,
i nie rozumiałem dlaczego oni złamać skryptu słowo tak.
Co to znaczy: "document.write ('<scr' + 'ipt ..."?

czy ktoś wie, czy istnieje jakikolwiek powód do tego?

document.write("<scr"+"ipt language=javascript src=http://l.yimg.com/d/lib/bc/bc_2.0.4.js></scr"+"ipt>"); 

Odpowiedz

39

Rozważmy następujący uproszczony przykład:

<script> 
document.write("something </script> something"); 
</script> 

przeglądarki HTML parser ujrzy </script> obrębie łańcucha JavaScript i zinterpretować jako koniec elementu skryptu.

Analizator składni HTML nie zna składni JavaScript - wie tylko, że element <script> kończy się na następnym </script>.

(wie również, że nie można mieć zagnieżdżone <script> elementów, stąd zerwanie otworu <script> jak również zamykania </script> w swoim przykładzie).

+13

Uwaga : Tak samo zachowuje się kolorowanie kodu w SO.Zauważ, że "coś" jest traktowane jako treść tekstowa poza elementem skryptowym –

+1

Właściwie, nie, element SCRIPT kończy się w pierwszym wystąpieniu " ". Zobacz: http://www.w3.org/TR/html4/types.html#type-cdata – kangax

+1

Czy jest to obejście starych przeglądarek lub czy ma zastosowanie nawet do nowoczesnych przeglądarek? – hasen

3

tak, że nie zostanie oceniony, ale zostaje wstawiony jako ciąg znaków.

3

Jest to zły sposób, aby zapobiec wykrzyczaniu kodów źródłowych XML/XHTML i HTML.

+2

Dlaczego Google Analytics używa tej metody, jeśli jest ona zła? "document.write (unescape ("% 3Cscript src = "" + gaJsHost + "google-analytics.com/ga.js" ... dlaczego robią to nawet z document.write Nie rozumiem. – vsync

0

Niektóre przeglądarki mają tendencję do „działać” na szybko, kiedy parsowanie dokumentu i natychmiast spróbować wykonać javascript po znalezieniu znacznika skryptu (nawet jeśli sam jest w kawałku js). Aby tego uniknąć, łamią znak etykiety.

+0

Nie bardzo rozumiałem, co właśnie powiedziałeś, czy możesz dostarczyć dalsze czytanie na ten temat, proszę? bardzo, bardzo interesujące – vsync

+0

Powiedz, że otwierasz stronę z IE, że ma document.write (''), na nim tak mewhere na stronie. IE może niepoprawnie sparsować ten document.write ('') i pomyśleć" hej, tag skryptu! ", A następnie wykonuje ten kod (ponieważ myśli, że to po prostu wbudowany blok skryptu). w rzeczywistości that document.write (''); nie powinno być wykonywane dopóki nie powiesz, że cała strona została załadowana lub dopóki nie zostanie spełniony jakiś inny warunek (może to być wszystko, począwszy od użytkownika wprowadzającego tekst itp.), poprzez złamanie Colin

4

Załóżmy, że piszesz narzędzie, które wykrywa początek i koniec bloków skryptu w kawałku tekstu. Załóżmy widać

<blah><blahdeblah><script> 

blah blah blah 

blah 

print("</script>") 

print("<script>") 

blah 

</script> 

</blahdeblah></blah> 

Bez znajomości składni języka skryptowego, w jaki sposób narzędzie wiedzieć, że jest to jeden blok skryptu i nie dwa bloki skrypt „) bla między nimi?

przeglądarka internetowa jest .. takie narzędzie jest to rozsądna praktyka, aby upewnić się, że nigdy nie należy mylić z przeglądarki internetowej, nie mając <script> lub </script> w pliku, chyba że faktycznie jest tag script

0

pełne omówienie tego, zobaczyć:
    http://www.wwco.com/~wls/blog/2007/04/25/using-script-in-a-javascript-literal/

Krótka odpowiedź brzmi, że twój kod jest parsowany w dwóch dyskretnych krokach.

Pierwszym z nich jest XML. Oznacza to, że element poszukuje </SCRIPT >. Należy pamiętać, że elementy XML są agnostyczne. Oznacza to, że parser nie zna jeszcze , w którym jest JavaScript.

Po jej zawartości <SCRIPT> elementu następnie przetwarza ten fragment tekstu, który przypuszczalnie jest JavaScript.

Dzieląc znacznik za pomocą operatora łączenia ciągów, można zapobiec ciągłemu potknięciu się fazy XML.

Jednym prostym rozwiązaniem jest umieszczenie & lt; i & gt; w tekście JavaScript.

+2

Wszystko dobrze, z tym wyjątkiem, że jest analizowany jako HTML (czyli SGML), a nie XML. HTML ma bardzo specyficzne sformułowanie dla '". Stąd dlaczego działa sztuczka JS. XML będzie po prostu barfował na pierwszym '<' wewnątrz, chyba że używasz CDATA (i jeśli używasz CDATA, to nie potrzebujesz sztuczki JS). –