2014-09-27 2 views
0

Следующий код:Почему самозакрытый тег скрипта не вызывает ошибки?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>A</title> 
    <script type="text/javascript" src="./script.js" /> 
    <script type="text/javascript">alert("This is skipped.");</script> 
</head> 
<body>  
</body> 
</html> 

проходит тест проверки в W3C и Chrome не отображает ошибки Javascript на этой странице. Тем не менее, весь текст <script type="text/javascript">alert("This is skipped."); не анализируется механизмом Javascript, который просто ищет тег </script>, даже если он сам закрыт. Однако файл «script.js» загружен.

В Chrome, Firefox и IE 11 это приводит к такому же поведению.

Почему это? Что на самом деле происходит здесь?

+1

Самозакрывающиеся теги проверяются в html. И, очевидно, это не ошибка JavaScript, которая остановит выполнение, которое вы предполагаете. –

+1

Это действительный _XML_, действительный 'application/xhtml + xml', но _HTML_ на самом деле происходит от более старого _SGML_, где есть несколько понятий, которые в общем виде (так равны) в _XML_, как правило, должны быть закрыты (самозакрытое 'br', неявно закрытое' p', явно закрытое 'textarea'); и 'script' должны быть явно закрыты. –

ответ

5

Код, который у вас есть, действителен, поскольку у вас есть доктрины XHTML. В XHTML любому элементу разрешено использовать самозакрывающийся синтаксис (хотя для большинства из них это мало смысла).

Если вы подавали документ с типом содержимого XML (например, Content-Type: application/xhtml+xml), он также работал бы в браузерах.

Поскольку вы (предположительно) обслуживаете документ с помощью Content-Type: text/html, браузер проанализирует его как HTML.

  1. Первый скриптовый тег будет проанализирован (/ будет проигнорирован или обработан как недопустимый атрибут).
  2. Второй тег сценария будет разобрано в HTML-парсер в JavaScript (так он будет рассматриваться как текст)
  3. Первый конец тега скрипта будет разобранного (и закрыть тег сценария из (1))
  4. Поскольку первый скриптовый тег имеет атрибут src, внешний скрипт будет загружен и передан в парсер JS
  5. Встроенный «JavaScript» (второй тег сценария) не будет передан парсеру JS, поскольку элемент сценария может 't иметь внешний встроенный скрипт и (так что вы не получите от него JS-ошибку). Он может быть добавлен, как текст, в DOM.

Обратите внимание, что использование самозакрывающегося синтаксиса для элементов сценария запрещено appendix C, потому что анализаторы HTML не дают желаемого результата. В целом, XHTML намного больше проблем, чем стоит 99% + времени, и вы должны придерживаться использования HTML вместо XHTML.

0

Элемент сценария обычно используется двумя способами: либо содержать код между двумя тегами элемента сценария, либо содержит код. Когда он включает код, технически не нужен конечный тег для элемента script.

Самый быстрый способ проверить код как фактический XHTML (приложение/XHTML + XML) является создание файла с расширением файла .xhtml, а затем открыть этот файл в Firefox. Gecko, в отличие от двух вилок Webkit (Chrome и Safari) и Trident (IE), фактически сломает страницу и вместо этого отобразит сообщение об ошибке синтаксического анализа XML, другие механизмы рендеринга просто прекратят рендеринг в точке, где возникла ошибка синтаксического анализа XML.

Немного о правильной обработке script элементов ...

  1. Нет такой мим, как «text/javascript», это фактически application/javascript.
  2. IE Microsoft не понимает JavaScript до IE9 и просто не будет отображать JavaScript, если только он не используется с этим несуществующим странным миром «text/javascript». Если вы строите свой собственный материал 2014 года или просто просто игнорируете Internet Explorer 8 и старше, поскольку к тому времени, когда вы принесете что-то на рынок, их акции будут совершенно незначительными.
  3. Избегайте помещать элементы сценария в элемент тела, если вы пытаетесь научиться правильно и строгать код, это заставит вас организовать вещи; убедитесь, что вы используете пар атрибут/значение , если вы поместили script элементов в теле по соображениям производительности.
  4. Если у вас много скриптов, просто используйте язык сценариев сервера, например PHP, до include() нескольких файлов в одном файле. Вам нужно будет использовать Apache, чтобы включить рендеринг PHP в файле *.js, и вам нужно будет вывести правильный мим.

JavaScript Пример

<script defer="defer" type="application/javascript"> 
//<![CDATA[ 
window.onload = function 
{ 
alert('Hello World.'); 
} 
// ]]> 
</script> 

Все, что я уже говорил можно увидеть на моем сайте в моем профиле, как я код так строго, как это возможно. Уверенный строгий код занимает больше времени, хотя в конечном итоге я почти не поддерживаю обслуживание, которое в конечном итоге спасает меня от орды.

Смежные вопросы