Почему самозакрывающиеся теги сценариев не работают?

в чем причина того, что браузеры неправильно распознают:

<script src="foobar.js" /> <!-- self-closing script tag -->

только это признает:

<script src="foobar.js"></script>

это нарушает концепцию поддержки XHTML?

Примечание: это утверждение правильно, по крайней мере, для всех IE (6-8 beta 2).

11 ответов


спецификация XHTML 1 говорит:

С.3. Минимизация элемента и пустое содержимое элемента

учитывая пустой экземпляр элемента, модель содержимого которого не является EMPTY (например, пустой заголовок или абзац) не используйте свернутую форму (например, используйте <p> </p>, а не <p />).

XHTML DTD задает теги скрипта как:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>

чтобы добавить к тому, что Брэд и squadette сказали, самозакрывающийся синтаксис XML <script /> на самом деле и правильный XML, но для того, чтобы он работал на практике, ваш веб-сервер также должен отправлять ваши документы Как правильно сформированный XML с типом XML, как application/xhtml+xml в заголовке HTTP Content-Type (и не as text/html).

однако отправка XML-mimetype приведет к тому, что ваши страницы не будут проанализированы IE7, который только любит text/html.

от w3:

вкратце, 'application / xhtml+xml' Следует использовать для семейства XHTML документы и использование 'text / html' Должен быть ограничен HTML-совместимым Документы XHTML 1.0. 'application / xml' и "текст / xml" также может быть использован, но при необходимости, следует использовать' application/xhtml+xml' вместо этих универсальных XML-носителей типы.

я озадачен этим несколько месяцев назад, и единственный работоспособный (совместимый с FF3+ и IE7) решение было использовать старый <script></script> синтаксис с text/html (синтаксис HTML + Тип HTML).

если ваш сервер отправляет text/html введите его HTTP-заголовки, даже с другими правильно сформированными документами XHTML, FF3+ будет использовать свой режим рендеринга HTML, что означает, что <script /> не будет работать (это изменение, Firefox ранее был менее строгим).

это произойдет независимо от любой возни с http-equiv мета-теги, XML-пролог или doctype внутри ваш документ -- Firefox ветви, как только он получает text/html заголовок, который определяет, смотрит ли синтаксический анализатор HTML или XML внутри документа, и синтаксический анализатор HTML не понимает <script />.


Если кому-то интересно, конечная причина в том, что HTML изначально был диалектом SGML, который является странным старшим братом XML. В SGML-land теги могут быть указаны в DTD как самозакрывающиеся (например, BR, HR, INPUT), неявно закрываемые (например, P, LI, TD) или явно закрываемые (например, TABLE, DIV, SCRIPT). XML, конечно, не имеет понятия об этом.

синтаксические анализаторы tag-soup, используемые современными браузерами, развились из этого наследия, хотя их модель синтаксического анализа не является чистой SGML больше. И, конечно, ваш тщательно созданный XHTML рассматривается как плохо написанный SGML-вдохновленный суп-тег, если вы не отправляете его с типом XML mime. Вот почему...

<p><div>hello</div></p>

...интерпретируется браузером как:

<p></p><div>hello</div><p></p>

...это рецепт прекрасной неясной ошибки, которая может бросить вас в припадки, когда вы пытаетесь кодировать против DOM.


другие ответили " как " и процитировали спецификацию. Вот реальная история "почему нет <script/>", после многих часов копания в отчетах об ошибках и списках рассылки.


HTML 4

HTML 4 основан на SGML.

SGML имеет некоторые shorttags, например <BR//, <B>text</>, <B/text/ или <OL<LI>item</LI</OL>. XML принимает первую форму, переопределяет окончание как " > " (SGML является гибким), так что он становится <BR/>.

однако HTML не redfine, поэтому <SCRIPT/> должны mean <SCRIPT>>.
(Да, " > " должно быть частью содержимого, а тег по-прежнему не закрытые.)

очевидно, что это несовместимо с XHTML и будет перерыв многих сайтов (к тому времени браузеры были достаточно зрелыми уход об этом), так никто не реализовал shorttags и спецификация советует против них.

эффектно, все "работая" само-законченные бирки бирки с опционной биркой конца на технически не-соответствуя парсерах и в действительности недействительны. Это был W3C, который придумал этот хак чтобы помочь перейти на XHTML, сделав это HTML-совместимые.

и <script>'s конец тега не обязательно.

тег"Self-ending" - это хак в HTML 4 и бессмысленный.


HTML 5

в HTML5 пять типов теги и только теги "void" и "foreign" являются разрешено самозакрываться.

, потому что <script> - это не пустота (это мая имеют контент) и не является иностранным (например, MathML или SVG),<script> не может быть самозакрывающимися, независимо от того, как вы используете его.

но почему? Разве они не могут рассматривать это как иностранное, сделать особый случай?, или что-то?

HTML 5 стремится быть обратной совместимости С реализации HTML 4 и XHTML 1. Он не основан на SGML или XML; его синтаксис в основном связан с документированием и объединением реализаций. (Вот почему <br/> <hr/> etc. are допустимый HTML 5 несмотря на недопустимость HTML4.)

самозакрывающиеся <script> один из тегов, где реализации отличаются. Это используется для работы в Chrome, Safari, и опера; насколько мне известно, он никогда не работал в Internet Explorer или Firefox.

об этом шла речь когда HTML 5 разрабатывался и был отклонен, потому что он разрывы обозреватель совместимость. Веб-страницы, которые самостоятельно закрывают тег сценария, могут отображаться неправильно (если вообще) в старых браузерах. Были другие предложения, но они не могут решить совместимости проблема.

после того, как проект был выпущен, WebKit обновил парсер, чтобы быть в соответствии.

самозакрывающиеся <script> не происходит в HTML 5 из-за обратной совместимости с HTML 4 и XHTML 1.


XHTML 1 / XHTML 5

, когда действительно служил в качестве XHTML,<script/> действительно закрыт, так как другие ответы обьявили.

за исключением того, что спец говорит это должны работали, когда служил HTML:

документы XHTML ... может быть помечен типом интернет-носителя "text / html" [RFC2854], так как они совместимы с большинством HTML-браузеров.

Итак, что случилось?

человек спросил Mozilla to пусть Firefox разбирает соответствующие документы как в XHTML независимо от указанного содержания заголовок (известный как содержание шмыг). Это позволило бы самозакрывающимся скриптам и обнюхиванию контента необходимо в любом случае, потому что веб-хостеры не были достаточно зрелыми, чтобы обслуживать правильный заголовок; IE был хорошо.

если первая война браузеров не закончилось IE 6, XHTML, возможно, тоже был в списке. Но все закончилось. И IE 6 проблема С XHTML. На самом деле IE не поддержка правильный тип MIME на всех, заставляя все использовать text/html для XHTML, потому что IE имел основную долю рынка целое десятилетие.

а также содержание нюхают может быть очень плохо и люди говорят это должно быть остановлено.

наконец, оказывается, что W3C не значит, XHTML, чтобы быть sniffable документ и, HTML и XHTML, и Content-Type правила. Можно сказать, что они твердо стояли на "просто следуйте нашим спецификациям" и игнорируя то, что было практичным. Ошибка продолжение в более поздние версии XHTML.

во всяком случае, это решение решен вопрос для Firefox. Это было за 7 лет до Chrome родился; не было другого значительного браузера. Так было решено.

С указанием только doctype не запускает синтаксический анализ XML из-за следующих спецификаций.


Internet Explorer 8 и более ранние версии не поддерживают синтаксический анализ XHTML. Даже если вы используете объявление XML и / или XHTML doctype, старый IE по-прежнему анализирует документ как простой HTML. И в простом HTML, самозакрывающийся синтаксис не поддерживается. Конечная косая черта просто игнорируется, вы должны использовать явный закрывающий тег.

даже браузеры с поддержкой синтаксического анализа XHTML, такие как IE 9 и позже, по-прежнему будет анализировать документ как HTML, если вы не обслуживаете документ с XML тип содержимого. Но в этом случае старый IE не будет отображать документ вообще!


люди выше уже в значительной степени объяснили проблему, но одна вещь, которая может сделать вещи ясными, что, хотя люди используют '&lt;br/>' и такое все время в HTML документы, каких-либо '/' в такой позиции в основном игнорируется и используется только при попытке сделать что-то разбираемым как XML и HTML. Попробуй!--5-->, например, и вы получаете обычный абзац.


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

С другой стороны, HTML имеет отличный тег для включения ссылки на внешние ресурсы:<link> tag, и это может быть самозакрывающийся. Он уже используется для включения таблиц стилей, RSS и Atom корма, канонические Ури и всевозможные другие лакомства. Почему нет В JavaScript?

Если вы хотите, чтобы тег сценария был замкнут, вы не можете сделать это, как я сказал, но есть альтернатива, хотя и не умная. Вы можете использовать тег self closing link и ссылку на ваш JavaScript, предоставив ему тип text / javascript и rel как скрипт, что-то вроде ниже:

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />

в отличие от XML и XHTML, HTML имеет никакого знания самозакрывающиеся синтаксис. Браузеры, которые интерпретируют XHTML как HTML, не знают, что / символ указывает, что тег должен быть самозакрывающимся; вместо этого они интерпретируют его как пустой атрибут, и парсер все еще думает, что тег "открыт".

как <script defer> трактуется как <script defer="defer">, <script /> трактуется как <script /="/">.


Internet Explorer 8 и старше не поддерживают правильный тип MIME для XHTML,application/xhtml+xml. Если вы обслуживаете XHTML как text/html, который вы должны для этих старых версий Internet Explorer, чтобы сделать что-нибудь, он будет интерпретироваться как HTML 4.01. Синтаксис short можно использовать только с любым элементом, который позволяет опустить закрывающий тег. Вижу спецификация HTML 4.01.

XML 'short form' интерпретируется как атрибут с именем /, который (поскольку нет знак равенства) интерпретируется как имеющее неявное значение"/". Это строго неправильно в HTML 4.01-необъявленные атрибуты не разрешены - но браузеры будут игнорировать его.

IE9 и позже поддержка XHTML 5 подается с application/xhtml+xml.


разница между "true XHTML", "faux XHTML" и HTML, а также важность типа MIME, отправленного сервером, была уже описано здесь хорошо. Если вы хотите попробовать прямо сейчас, вот простой редактируемый фрагмент с Live preview, включая самозакрывающийся тег скрипта для способных браузеров:

div { display: flex; }
div + div {flex-direction: column; }
<div>Mime type: <label><input type="radio" onchange="t.onkeyup()" id="x" checked  name="mime"> application/xhtml+xml</label>
<label><input type="radio" onchange="t.onkeyup()" name="mime"> text/html</label></div>
<div><textarea id="t" rows="4" 
onkeyup="i.src='data:'+(x.checked?'application/xhtml+xml':'text/html')+','+encodeURIComponent(t.value)"
><?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[<!ENTITY x "true XHTML">]>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
  <p>
    <span id="greet" swapto="Hello">Hell, NO :(</span> &x;.
    <script src="data:text/javascript,(g=document.getElementById('greet')).innerText=g.getAttribute('swapto')" />
    Nice to meet you!
    <!-- 
      Previous text node and all further content falls into SCRIPT element content in text/html mode, so is not rendered. Because no end script tag is found, no script runs in text/html
    -->
  </p>
</body>
</html></textarea>

<iframe id="i" height="80"></iframe>

<script>t.onkeyup()</script>
</div>

вы должны увидеть Hello, true XHTML. Nice to meet you! ниже textarea.

для неспособных браузеров вы можете скопировать содержимое textarea и сохраните его как файл с помощью .xhtml (или .xht расширения) (спасибо Алек за этот намек).


это потому, что тег скрипта не является элементом VOID.

на HTML-документ - ЭЛЕМЕНТЫ ПУСТОТЫ не нужен "закрывающий тег" вообще!

на в XHTML, все является общим, поэтому они все нуждаются прекращение например, "закрывающий тег"; включая br, простой разрыв строки, как <br></br> или сокращение <br />.

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

главным образом, семантическая инструкция завершения, например, "закрывающий тег" необходим только для обработки инструкций, семантика которых не может быть завершена следующим тегом. Например:

<H1> семантика не может быть расторгнут по следующим <P> потому что он не несет достаточно своей собственной семантики для переопределения и поэтому завершите предыдущий набор инструкций H1. Хотя он сможет сломать поток в новую строку абзаца он не "достаточно силен", чтобы переопределить текущий размер шрифта и высоту строки стиля льется вниз по течению, i.e утечка из H1 (потому что у P ее нет).

вот как и почему была изобретена сигнализация "/" (прекращение).

универсальный нет-описание тег завершения, как < />, было бы достаточно для любого одиночного падения встреченного каскада, например:<H1>Title< /> но это не всегда так, потому что мы также хотим иметь возможность "вложенности", множественного промежуточного тегирования потока: разделить на потоки перед обертыванием / падением на другой каскад. Как следствие, общий Терминатор, такой как < /> не сможет определить цель свойства для завершения. Например: <b>полужирный <i>полужирный курсив < /> курсив </>нормальный. Несомненно, не удастся правильно понять наше намерение и, скорее всего, истолкует его как полужирный смелый-itallic полужирный нормальный.

это как понятие обертки ie. родился контейнер. (Эти понятия настолько похожи, что невозможно различить, а иногда один и тот же элемент может иметь как. <H1> - это как фантик и контейнер в то же время. Тогда как <B> только семантическая оболочка). Нам понадобится простой контейнер без семантики. И, конечно, изобретение элемента DIV пришло.

элемент DIV фактически является 2br-контейнером. Конечно, появление CSS сделало всю ситуацию более странной, чем она была бы в противном случае, и вызвало большую путаницу со многими большими последствиями - косвенно!

потому что с CSS вы можете легко переопределить родной pre & after BR поведение вновь изобретенного DIV, его часто называют, как "контейнер ничего не делать". Что, естественно, неправильно! DIVs являются блочными элементами и изначально нарушают линию потока как до, так и после завершения сигнализации. Вскоре сеть начала страдать от Page DIV-itis. Большинство из них до сих пор.

появление CSS с его возможностью полностью переопределить и полностью переопределить собственное поведение любого HTML-тега, каким-то образом удалось запутать и размыть весь смысл HTML-код бытия...

внезапно все HTML-теги оказались как бы устаревшими, они были испорчены, лишены всего их первоначального значения, идентичности и назначения. Почему-то создается впечатление, что они больше не нужны. Говоря: одного тега контейнера-обертки будет достаточно для представления всех данных. Просто добавьте необходимые атрибуты. Почему бы вместо этого не иметь значимых тегов; придумывайте имена тегов, когда вы идете, и пусть CSS беспокоится об остальном.

так родился xhtml и конечно, великий Блант, за который так дорого платят новички и искаженное представление о том, что есть что, и какова, черт возьми, цель всего этого. W3C перешел от Всемирной паутины к тому, что пошло не так, товарищи?!!

целью HTML является поток значимые данные для получателя человека.

для получения информации.

формальная часть существует только для того, чтобы помочь ясности доставки информации. xhtml не уделяет ни малейшего внимания информация. - Для него информация абсолютно не имеет значения.

самое главное в этом деле-знать и уметь понимать это xhtml-это не просто версия расширенного HTML, xhtml-совершенно другой зверь; заземляется; и поэтому разумно держать их отдельно.