В прошлом веке был популярный «хак», чтобы скрыть JavaScript от браузеров, не поддерживающих JavaScript:
<script type = "text/javascript">
<!--
alert("Hello, World!");
// --> Your browser doesn't support JavaScript
</script>
Несмотря на то, что <!--
в ряде руководств объясняется как однострочный комментарий JavaScript , это нигде не упоминается в стандарте ECMAScript (см. 7.4 Комментарии а>). Несмотря на то, что этот тип комментариев не является стандартным, он поддерживается всеми современными браузерами, поэтому с его помощью вы можете закомментировать любой код JavaScript:
<script type = "text/javascript">
<!-- alert("Hello, World!");
<!-- This is a comment
<!-- This is another comment
<!-- This is yet another comment
</script>
Тем не менее, есть одно исключение: функция eval()
. Следующий код правильно работает в Communicator 4.x/Mozilla/Opera(Presto)/Safari/Chrome, но вызывает синтаксическую ошибку в MSIE:
<form action = "#">
<script type = "text/javascript">
function testEval() {
var s = "<!--\n";
s += "alert(\"eval() invoked\");\n";
s += "// -->"
eval(s);
}
</script>
<input type = "button" value = "Test eval()" onclick = "testEval();"/>
</form>
По сути, в отличие от всех других браузеров, MSIE не работает на eval("<!--")
.
2 вопроса:
- Каков статус
<!--
в JavaScript? Определен ли он в каких-либо (даже устаревших) спецификациях/документах JavaScript? Или современные браузеры просто сохраняют какую-то совместимость от ошибки к ошибке? Изменить: на этот вопрос уже был дан ответ. - У вас есть идеи, чем отличается MSIE/Trident? В частности, следует ли сообщать Microsoft об этом нестандартном поведении (функции
eval()
) как об ошибке?
<!--
— синтаксическая ошибка. Но поскольку<script>
— это элемент с узломtext
, который содержит код, синтаксический анализатор HTML удаляет содержимое из DOM. (Если я ошибаюсь, пожалуйста, поправьте меня) - person Ismael Miguel   schedule 06.05.2015<script>
(например, если это Netscape 1.0), он не будет рассматривать сценарий как текст, который будет отображаться пользователю. (Это бессмысленно в этом веке). - person Quentin   schedule 06.05.2015<!--
внутри<script>
элементов особым образом, потому что это единственное место, где они могут иметь смысл. Они не имеют смысла в произвольном коде JS (например, вeval
), и я предполагаю (хотя я не могу это проверить), что вы также получите синтаксическую ошибку, если включите код как скриптsrc
. Однако я не работаю над IE и не знаю никого, кто этим занимается, так что это всего лишь предположение. - person Felix Kling   schedule 06.05.2015<script><!-- a --></script>
и<div><!-- a --></div>
будут проанализированы парсером HTML как<script></script>
и<script></script>
. Поскольку пустой<script>
не является недопустимым HTML и не является недопустимым Javascript, все проходит нормально, без ошибок. При запускеeval('<!--');
движок Javascript ожидает чистый Javascript. Это моя дикая догадка. И предположим, что IE не отстой (намного). - person Ismael Miguel   schedule 06.05.2015<!--
внутри элемента<script>
на самом деле интерпретируется движком JS, а не парсером HTML. Обратите внимание, что в примерах нет закрывающего-->
. Другой вопрос объясняет, что<!--
обрабатываются как однострочные комментарии в JS. - person Felix Kling   schedule 06.05.2015eval()
в прошлом. Обратите внимание, чтоFunction('<!--')()
выдает синтаксическую ошибку в IE11 (как и в случае сeval()
). Но поскольку это устарело, проблем нет. Думаю, браузеры не обязаны иметь устаревшую функциональность. - person Ismael Miguel   schedule 06.05.2015