Почему добавление</script> в комментарий нарушает парсер?
Почему добавление </script>
в комментарии разбивает парсер? Это ошибка или есть что-то в документации, которую я пропустил?
Я тестировал это в браузере Chrome, Firefox, Opera, Internet Explorer, и все они дают одинаковый результат.
Однострочный комментарий:
function Foo(){
// </script>
alert("bar");
};
Foo();
Ответы
Ответ 1
Это происходит потому, что парсер HTML, определенный W3C, полностью отделен от парсера JavaScript. После тега <script>
он ищет закрытие </script>
, независимо от того, что он внутри комментариев или строк, потому что он рассматривает JS-код как обычный текст.
Ответ 2
Парсер HTML не анализирует JavaScript. Он анализирует только HTML-элементы, обозначенные тегами <tag>
и </tag>
. Он не знает, что что-то является комментарием к JavaScript. Когда он видит тег закрытия </script>
, он предполагает, что элемент script закрывается. То же самое произошло бы в любом контексте, когда появилась строка </script>
; например, console.log("</script>")
приведет к такому же поведению.
Это довольно хорошая причина не встраивать скрипты внутри HTML, а скорее включать их извне.
Ответ 3
Вы можете использовать встроенный JavaScript-код с HTML-кодом
<script type="text/javascript">
<!--
function Foo(){
// </script>
alert("bar");
};
Foo();
//-->
</script>
Таким образом, весь код JavaScript рассматривается как комментарий HTML парсером HTML, а строки комментариев HTML игнорируются интерпретатором JavaScript.
Ответ 4
Простым обходным решением будет вложение комментариев:
function Foo(){
//<!-- </script> -->
alert("bar");
};
Foo();
Он будет комментировать строку для javascript И для html.