Чрезвычайно странный глюк в Chrome - разбирает содержимое строки! - PullRequest
3 голосов
/ 23 апреля 2010

Хорошо - это самый тупой сбой, который я когда-либо видел:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type='text/javascript'>

var data = "</script>";

</script>
</head>
<body>

This should break!

</body>
</html>

Это вызывает синтаксические ошибки, потому что синтаксический анализатор JavaScript фактически читает содержимое строки. Как глупо!

Как я могу вставить </script> в мой код. Есть ли способ?

Есть ли веская причина для такого поведения?

Ответы [ 4 ]

5 голосов
/ 23 апреля 2010

В X (HT) ML (когда фактически рассматривается как таковой ), сценарии должны быть экранированы как CDATA именно по этой причине.http://www.w3.org/TR/xhtml1/diffs.html#h-4.8

В XHTML элементы script и style объявляются как имеющие содержимое #PCDATA.В результате < и & будут рассматриваться как начало разметки, а такие объекты, как &lt; и &amp;, будут распознаваться процессором XML как ссылки на объекты на < и & соответственно,Обтекание содержимого скрипта или элемента стиля в разделе, помеченном CDATA, позволяет избежать расширения этих объектов.

<script type="text/javascript">
<![CDATA[
  ... unescaped script content ...
]]>
</script>

Если ваш XHTML-документ просто используется как text / html и рассматривается как теговый суп,это не относится, и вам просто нужно «экранировать» строку, например '</scr' + 'ipt>'.

2 голосов
/ 23 апреля 2010

Это не глюк - это нормальное ожидаемое поведение, и это вполне справедливо, если подумать.Спецификации HTML не определяют языки сценариев, поэтому движок должен видеть простой текст вплоть до </script>, который закрывает тег.Есть несколько опций, отличных от уже описанных:

// escape the / character, changing the format of the "closing" tag
var data = "<\/script>"; 

// break up the string
var data = "</"+"script>";

Первый метод работает, потому что HTML не использует \ для экранирования, он рассматривается как буквальный символ и, конечно, <\/script> не является допустимым закрывающим тегом.Второй работает по более очевидным причинам, но кто-то здесь сказал мне, что его не следует использовать (и я так и не понял, почему).

0 голосов
/ 06 ноября 2012

Если вы можете верить стандарту HTML4 , содержимое сценария

заканчивается на первом ETAGO ("

0 голосов
/ 23 апреля 2010

Запишите это так:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type='text/javascript'>
<!--
var data = "</script>";
-->
</script>
</head>
<body>
This should break!
</body>
</html>

Причина в том, что HTML анализируется перед выполнением javascript, а <!-- и --> заставляют анализатор игнорировать все теги, которые появляются в этом разделе.

...