2009-09-24 4 views
19

Я видел это на каждом Yahoo! news page, в нижней части исходного кода,
и не понял почему они нарушают сценарий слово подобное.
Что это значит: «document.write ('<scr' + 'ipt ..."?

кто-нибудь знает, есть ли причина для этого?

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

ответ

39

Рассмотрим упрощенный пример:

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

HTML парсер браузера будет увидеть </script> в строке JavaScript и интерпретировать, что в конце элемента сценария.

Парсер HTML не знает о синтаксисе JavaScript - все, что он знает, это то, что элемент <script> заканчивается на следующем </script>.

(Он также знает, что вы не можете иметь вложенных <script> элементов, следовательно, нарушение открытия <script>, а также закрытия </script> в вашем примере.)

+13

Примечание. : То же самое ведет к окрашиванию кода в SO. Обратите внимание, что «что-то» рассматривается как текстовое содержимое вне элемента сценария. –

+1

Фактически нет, элемент SCRIPT заканчивается при первом появлении « ". См. Http://www.w3.org/TR/html4/types.html#type-cdata – kangax

+1

Это обходное решение для старых браузеров или оно применяется даже к современным браузерам? – hasen

3

так, чтобы она не получить оценку, но вставляется в виде строки.

3

Это плохой способ предотвратить криптование документов XML/XHTML и HTML от исходного кода.

+2

Так почему же Google Analytics использует этот метод, если это плохо? "document.write (unescape ("% 3Cscript src = '"+ gaJsHost +" google-analytics.com/ga.js "... почему они даже делают это с document.write Я не понимаю. – vsync

0

Некоторые браузеры, как правило, «действовать», чтобы быстро, когда разбора документа и сразу же попытаться выполнить javascript, когда они найдут тег скрипта (даже если он сам находится в куске js). Чтобы избежать этого, они разрушают декализацию метки.

+0

Я не совсем понял, что вы только что сказали, можете ли вы продолжить чтение по этому вопросу? Это очень интересно. – vsync

+0

Скажите, что вы открываете страницу с IE, что имеет document.write ('

4

Предположим, вы пишете инструмент, который обнаруживает начало и конец блоков сценария в куске текста. Предположим, что вы видите

<blah><blahdeblah><script> 

blah blah blah 

blah 

print("</script>") 

print("<script>") 

blah 

</script> 

</blahdeblah></blah> 

Не зная синтаксис языка сценариев, как это ваш инструмент знаю, что это один блок сценария, а не два сценария блоки «) мля между ними?

Веб-браузер .. такой инструмент это разумная практика, чтобы убедиться, что вы никогда не путайте веб-браузер, никогда не имея <script> или </script> в файл, если он на самом деле не является сценарий тег

0

для полного обсуждения этого см:
    http://www.wwco.com/~wls/blog/2007/04/25/using-script-in-a-javascript-literal/

Короткий ответ заключается в том, что ваш код анализируется двумя дискретными шагами.

Первый - это XML. И это означает, что элемент <SCRIPT> ищет </SCRIPT >. Важно помнить, что элементы XML являются агностическими. Это означает, что анализатор не знает , но, что есть JavaScript.

После того, как он имеет содержание > элемента < SCRIPT, затем обрабатывает этот кусок текста, который предположительно является JavaScript.

Разбирая тег оператором конкатенации строки, вы предотвращаете постоянную отключение фазы XML.

Одним простым решением является помещение & lt; и & gt; в тексте Javascript.

+2

Все хорошо, за исключением того, что он анализируется как HTML (то есть SGML), а не XML. HTML имеет очень специфическую формулировку для ''. Отсюда почему этот трюк JS работает. XML, с другой стороны, будет просто закрывать первый '' 'внутри, если вы не используете CDATA (и если вы используете CDATA, тогда вам не нужен трюк JS). –