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

По какой причине браузеры неправильно распознают:

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

Признается только это:

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

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

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


person dimarzionist    schedule 16.09.2008    source источник
comment
Я так понимаю, вы говорите о правильном XHTML? пара комментариев все еще говорит о XHTML   -  person squadette    schedule 16.09.2008
comment
Работает в Chrome и Opera   -  person corymathews    schedule 26.12.2008
comment
Также см. Этот вопрос: stackoverflow.com/questions/348736/   -  person alex    schedule 09.04.2010
comment
В некоторых последних версиях Chrome эта функция нарушена, самозакрывающиеся теги скрипта больше не работают в Chrome.   -  person Adam Ness    schedule 24.10.2010
comment
Это не просто теги сценария. Я тоже не верю, что самозакрывающиеся теги div работают.   -  person DOK    schedule 18.03.2011
comment
По состоянию на июль 2011 года эта проблема возникает в Chrome и Firefox. Это не ошибка, это особенность - очень раздражает.   -  person Martin Konicek    schedule 24.07.2011
comment
Самозакрывающиеся теги XHTML5   -  person Janus Troelsen    schedule 25.06.2013
comment
Я использую только самозакрывающиеся теги для изображений или входных данных, потому что я знаю, что остальные могут не поддерживаться в некоторых браузерах.   -  person Gilly    schedule 05.07.2013
comment
Два дня спустя был задан более общий вариант этого: stackoverflow.com/questions/97522/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 02.01.2014
comment
Кроме того, в некоторых версиях Chrome (по крайней мере, в моей, в настоящее время 34.0.1847.116) не только сценарий в самозакрывающемся теге не загружается, но он может сломать узлы сценария, определенные в удаленных местах документа (например, <script>s в <body>, даже если самозакрывающийся <script> был в <head>)   -  person Trindaz    schedule 10.04.2014
comment
Спрашивали в 2008 году и до сих пор сбивают с толку людей, в том числе и меня.   -  person willem    schedule 06.08.2019
comment
Я думаю, что за этим вопросом стоит предположение, что XHTML - это просто хорошо сформированное подмножество HTML. Но на самом деле использование XML <foo /> для самозакрывающихся тегов фактически не существует в HTML. Поведение тегов определяется спецификацией HTML. Веб-браузеры уже знают, например что <img> и<br> самозакрываются, а <div> и <script> не закрываются, поэтому они не полагаются на наличие или отсутствие /.   -  person mwfearnley    schedule 29.09.2019


Ответы (12)


Спецификация XHTML 1 гласит:

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

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

XHTML DTD определяет элементы скрипта как:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
person squadette    schedule 16.09.2008
comment
Тем не менее, «не надо» - это не то же самое, что «не должен». Это рекомендация (для совместимости, как указано в заголовке раздела), а не правило. - person Konrad Rudolph; 16.09.2008
comment
Собственно, я не могу найти применение этому ограничению :) Это кажется совершенно искусственным. - person squadette; 16.09.2008
comment
Правильный ответ дал olavk. Приложение C к XHTML 1.0 - это не причина того, почему дела обстоят так, как есть, а просто как работать с такими вещами. - person hsivonen; 09.10.2008
comment
Это не нормативная часть спецификации. Это всего лишь приложение о том, как работать с браузерами, которые не поддерживают XHTML. - person Kornel; 16.10.2008
comment
Тем не менее, браузеры очень хорошо понимают нотацию ‹p /›. - person shabunc; 18.07.2011
comment
Проблема с <script /> не в том, что это запрещено спецификацией, а в том, что браузеры не интерпретируют это как суп без тегов, если тип контента не application / xhtml + xml. См .: stackoverflow.com/questions/348736/ @shabunc: браузеры могут появляться, чтобы понять это, но на самом деле происходит то, что он помещает содержимое после ‹p /› внутри абзаца из-за интерпретации цитаты squadette как означающего, что, поскольку ‹p› не является пустым, он не может быть самозакрывающимся. В XHTML 1.1 он может быть самозакрывающимся. - person Joe; 29.07.2011
comment
4.3. Для непустых элементов требуются закрывающие теги - XHTML 1.0: расширяемый язык разметки гипертекста (второе издание): ... Все элементы, кроме тех, которые объявлены в DTD как EMPTY, должны иметь закрывающий тег. Элементы, объявленные в DTD как EMPTY, могут иметь закрывающий тег или использовать сокращенное обозначение пустого элемента. - person Jeremy Kao; 30.07.2018
comment
@JeremyKao 4.3 здесь не актуален. (см. примеры) Прокрутите вниз до 4.6, чтобы найти правило, более близкое к тому, что мы обсуждаем. - person James Curran; 10.09.2018
comment
Это какая-то тупая IT-бюрократия. Очевидно, нормальные люди ожидают, что это сработает / получит поддержку. Очевидно, с этим могут справиться парсеры и интерпретаторы. Или хотя бы выдать ошибку в консоли. Когда вы выполняете самозакрывающийся скрипт, вся страница не будет работать и никаких ошибок не будет. Но тогда <body onload="start()" /> работает нормально. - person Bitterblue; 26.09.2019
comment
@Bitterblue - в этом нет бюрократии. См. Ответ Грейма для получения исторической справки о том, почему это было сделано таким образом. См. Ответ Джоэлхарди о том, как улучшить ситуацию, отправив другой тип MIME. - person ToolmakerSteve; 08.10.2019
comment
Почему ‹script› не может использоваться сам по себе? Если is указывает атрибут src, он не имеет содержимого, поэтому ‹/script› ему вообще не нужен. - person David Spector; 03.05.2021

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

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

Из w3:

Таким образом, «application / xhtml + xml» ДОЛЖНО использоваться для документов семейства XHTML, а использование «text / html» ДОЛЖНО быть ограничено HTML-совместимыми документами XHTML 1.0. 'application / xml' и 'text / xml' также МОГУТ использоваться, но, когда это уместно, СЛЕДУЕТ использовать 'application / xhtml + xml', а не эти общие медиа-типы XML.

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

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

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

person joelhardi    schedule 16.09.2008
comment
Правильно ли тогда заключить, что если вы откажетесь от поддержки IE7, отправка text / xml обеспечит вам широкую поддержку браузером ‹script /›? - person Chris Moschini; 10.04.2013
comment
Короче говоря, ‹script /› будет работать, только если ваш MIME-тип страницы - xhtml / xml. Для обычных текстовых / html-страниц это не сработает. И если мы попытаемся использовать тип MIME xhtml / xml, это нарушит совместимость IE. Подводя итог, сохраняйте спокойствие и используйте ‹script› ... ‹/script› Спасибо, Джо ;-) - person Navin Israni; 09.12.2013
comment
Отличное объяснение. Еще один момент, на который стоит обратить внимание, заключается в том, что Firefox также будет иметь локальные .html файлы, отображаемые как суп из тегов, независимо от метатегов, по аналогичным причинам. Для файлов XHTML Firefox будет отображать их соответствующим образом только в том случае, если они будут названы .xhtml. - person alecov; 08.01.2015
comment
@ChrisMoschini. Возможно, но используйте application/xhtml+xml, а не text/xml. - person TRiG; 04.07.2017

Другие ответили «как» и процитировали спец. Вот настоящая история "почему нет <script/>" после многих часов копания в отчетах об ошибках и списках рассылки.


HTML 4

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

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

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

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

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

Конечный тег <script> не запрещен.

Самозаворачивающийся тег - это взлом HTML 4, который не имеет смысла.


HTML 5

HTML5 имеет пять типов тегов и только 'void' и ' Foreign 'теги могут быть самозакрывающимися.

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

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

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

Самозакрывающийся <script> - это один из тегов, реализация которого различалась. Он раньше работал в Chrome, Safari, и Opera; насколько мне известно, он никогда не работал в Internet Explorer или Firefox.

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

После того, как черновик был выпущен, WebKit обновил синтаксический анализатор, чтобы он соответствовал требованиям.

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


XHTML 1 / XHTML 5

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

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

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

Так что случилось?

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

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

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

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

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

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

person Sheepy    schedule 25.02.2015
comment
Самозакрывание <script> не происходит в HTML 5 из-за обратной совместимости. - это не совсем так, поскольку ни один аспект обратной совместимости не будет нарушен, то есть написанный код продолжит работу. для работы в новых браузерах, поддерживающих самозакрывающийся <script>. Настоящая причина в том, что <script> будет only самозакрывающимся тегом, поскольку HTML не определяет никаких других. Кроме того, только внешние теги могут быть самозакрывающимися, поскольку теги void не имеют закрывающего тега. См. начальные теги, шаг 6. - person Andy E; 14.03.2015
comment
@AndyE Когда вы пишете самозакрывающийся ‹script›, основные браузеры в то время не думают, что он закрыт, и будут анализировать подпоследовательность html как javascript, что приведет к поломке действительного HTML5 в этих старых браузерах. Таким образом, предложение отклоняется. Это объясняется в связанном списке рассылки HTML5. - person Sheepy; 16.03.2015
comment
неясно, почему предложение было отклонено, поскольку обсуждение завершается довольно резко, хотя одной из поднятых проблем было изменение существующих браузеров новым кодом. Я просто указываю, что <script> будет уникальным как элемент HTML5, которому разрешено самозакрываться. В своем первом комментарии я имел в виду, что обратная совместимость не пострадает, потому что обратная совместимость относится к старому коду, работающему в новых браузерах, что в данном случае нормально. - person Andy E; 16.03.2015
comment
@AndyE: Вы описываете прямую совместимость - способность старого кода работать с новым компилятором / интерпретатором / парсером. Обратная совместимость - это способность нового кода работать со старым компилятором / интерпретатором / парсером. Так что да, проблема была в обратной совместимости, поскольку в противном случае страницы, написанные с учетом новой спецификации, не работали бы в старых браузерах (и да, это традиция веб-программирования - стараться, чтобы новый код работал в старых браузерах в максимально возможной степени). - person slebetman; 09.12.2015
comment
ЕРЕСЬ! ссылка rel может работать без самозакрывания и самозакрывания, но скрипт не может. Это вопрос изменения одной строки DOCTYPE. Кроме того, я как человек, мнение которого не имеет значения, объявляю типы документов XHTML устаревшими, потому что теги html5 не подтверждают правильность xhtml. XHTML по-прежнему является фантастическим инструментом, он позволяет создавать настраиваемые сущности на странице html, позволяя использовать сущности вместо полных URL-адресов ссылок и сущности вместо вещей, которые могут быть изменены, например, имен. Но нет причин использовать для этого XHTML doctype, он устарел и никогда не обновлялся. Почему это все еще проблема! - person Dmitry; 27.04.2016
comment
@Dmitry На самом деле запрет на закрытие скрипта - это улица с односторонним движением. Как связанный самозакрывающийся ‹скрипт ›Сломает все браузеры, пользователи будут просто видеть пустую страницу - игровые консоли, Интернет-телевидение, IE 11 на новом корпоративном ПК с Win7, миллионы Java runtime или миллиарды смартфонов. Можете ли вы обновить WebView для большинства языков на большинстве устройств? Если бы HTML5 попытался это сделать, они потерпели бы неудачу, как XHTML2. - person Sheepy; 27.04.2016
comment
@Sheepy Начало периода прекращения поддержки и объединение его с крупным обновлением совместимости было бы началом. В качестве альтернативы это может быть сделано только для воздействия на веб-страницы xhtml, таким образом, правильно сформированные веб-страницы могут отображать и то, и другое, в то время как традиционный html будет принимать только то, что он принимает сейчас. Хотя XHTML потерпел неудачу во многих областях, он все еще может способствовать улучшению написания веб-страниц для устройств, которые не привязаны к одному и только одному способу записи. Без него HTML превращается в сборку, причем тяжелую. -продолжается- - person Dmitry; 27.04.2016
comment
@Sheepy HTML уже в основном рассматривается как веб-сборка, поскольку писать в нем напрямую сложно и сложно поддерживать. Его также можно заменить необработанным двоичным форматом, чтобы сэкономить еще больше места. XHTML усиливает большую часть этих проблем с помощью шаблонов, расширяемых сущностей, так что это позволяет поддерживать поддерживаемый способ написания HTML. Вместо этого большинство сайтов, которые я вижу, в основном сгенерированы, и те, которым не нужно бороться с такими устаревшими ошибками, как эта, и сложностью сохранения исходного кода, согласованного с ограничением в 80 символов на строку, без того, чтобы код выглядел беспорядочным. - person Dmitry; 27.04.2016
comment
@Dmitry В этом разделе вопросов и ответов основное внимание уделяется почему, и, возможно, это не подходящее место для обсуждения того, делает ли эта ошибка HTML5 устаревшим, ваша мечта о wasm для html или почему мы должны / не должны ограничивать наш код 80 символов (что у меня нет; и я разрабатываю эти генераторы html как свою работу). - person Sheepy; 27.04.2016
comment
@Sheepy Извини, я не имел в виду, чтобы сказать что-то из этого. Я не думаю, что HTML5 устарел; Я не мечтаю о wasm, я просто упоминаю о трудностях написания красивого ручного HTML; и меня очень интересует генерация HTML. Вы правы, это не тема о том, как преодолевать несоответствия в HTML, они могут быть слишком глубоко укоренившимися, чтобы их можно было решить, изменив только стандарт. - person Dmitry; 27.04.2016
comment
очень недооцененный ответ - person Kamil Tomšík; 21.08.2016
comment
Небольшая поправка: теги, которые в HTML работают как самозакрывающиеся, не имеют необязательных закрывающих тегов, а имеют закрывающие теги запрещенные (пустые или недействительные, теги). Теги с необязательными закрывающими тегами, такими как <p> или <li>, не могут быть 'самозакрывающимися', поскольку они могут иметь контент, поэтому код типа <p/> - не более чем ( malformed), и содержимое после него, если это разрешено в этом элементе, окажется внутри него. - person Ilya Streltsyn; 06.05.2017

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

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

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

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

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

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

person greim    schedule 25.07.2010
comment
Мне любопытно. почему браузер так интерпретирует это? - person Ahmed Aeon Axan; 30.10.2013
comment
@AhmedAeonAxan: элемент P не может содержать элементы DIV (это недопустимый HTML), поэтому браузер неявно закрывает элемент P (определенный как неявно закрываемый) перед открывающим тегом DIV. Однако браузеры, как правило, ведут себя по-другому в этом отношении (как и с любым недопустимым HTML). - person MrWhite; 04.11.2013
comment
@ w3d Можно ли поблагодарить Netscape или IE за такой суп из тегов? - person Cole Johnson; 05.09.2015
comment
@ColeJohnson Нет, это не суп из тегов; Грейм стирает границу между допустимым и недопустимым HTML. Суп из тегов - это то, что вы получаете, когда авторы не заботятся о правилах, потому что браузеры используют исправление ошибок. С другой стороны, отсутствующий конечный тег </p> на самом деле является частью определения HTML! - person Mr Lister; 17.12.2015
comment
@MrLister - Вроде. Суп тегов описывает, как анализируется HTML, а не как он создается. Этот термин использовался для описания разрозненных стратегий, используемых браузерами для понимания HTML, и контрастирует со строгим синтаксическим анализом XML. Синтаксический анализ XML разрешен только для типов mime XML, но поскольку они так и не получили широкого распространения, браузеры вернулись к различным схемам супа тегов, даже для документов, действительных во всех остальных отношениях. - person greim; 20.12.2015
comment
HTML5 фактически стандартизировал синтаксический анализ 'tag soup' , включая последовательный способ обработки недопустимой разметки. До этого браузеры должны были самостоятельно решать, что делать с недопустимой разметкой, что приводило к несогласованности. Анализатор HTML в современных браузерах - одна из самых передовых программ, когда-либо написанных. Невероятно быстрый и может обрабатывать практически любой ввод, обеспечивая стабильные результаты. - person Stijn de Witt; 09.01.2018
comment
Они не должны сначала разрешать суп из тегов и выдавать ошибку, чтобы исправить макет, вместо того, чтобы пытаться выяснить, что с этим делать. - person Dragas; 20.03.2021

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

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

person JacquesB    schedule 16.09.2008
comment
IE не поддерживает синтаксический анализ XHTML. было верно для версий IE на момент написания, но больше не так. - person EricLaw; 12.08.2013
comment
@EricLaw, можете ли вы уточнить, в какой версии IE это исправлено? (и любые особые условия - например, требуется действующий доктайп) - person scunliffe; 06.05.2014
comment
@scunliffe IE9 был первой версией с полной поддержкой XHTML. blogs.msdn.com/b/ie/archive/2010/11/01/ - person EricLaw; 06.05.2014

Вышеупомянутые люди уже в значительной степени объяснили проблему, но одна вещь, которая может прояснить ситуацию, заключается в том, что, хотя люди используют <br/> и тому подобное все время в документах HTML, любые / в такой позиции в основном игнорируются и используются только при попытке чтобы сделать что-то доступным для синтаксического анализа как XML, так и HTML. Попробуйте, например, <p/>foo</p>, и вы получите обычный абзац.

person Marijn    schedule 16.09.2008

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

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

Если вы хотите, чтобы тег скрипта был замкнутым, вы не можете этого сделать, как я сказал, но есть альтернатива, хотя и не разумная. Вы можете использовать тег самозакрывающейся ссылки и ссылку на свой JavaScript, задав ему тип text / javascript и rel as script, как показано ниже:

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
person defau1t    schedule 27.10.2012
comment
Мне это нравится, но почему это не умно? - person Josh M.; 18.09.2013
comment
Потому что есть предопределенный тег скрипта, который точно выполняет работу по загрузке скрипта ... Зачем вам путать вещи, используя что-то еще? Молоток забивает гвозди .. А башмаком пользоваться было бы? - person Dave Lawrence; 27.03.2014
comment
@daveL - У нас есть теги <style>, но мы используем теги ссылок для внешних файлов CSS. Определение тега ссылки: Тег ‹link› определяет связь между документом и внешним ресурсом. Кажется совершенно логичным, что тег ссылки будет использоваться для внешнего CSS или JS ... вот что это такое. для ... ссылки во внешних файлах. примечание Я не говорю о спецификациях / кроссбраузерности и т. д., я просто комментирую логическую природу использования тегов ссылок для добавления как CSS, так и JS ... это действительно много смысла, если бы это было так. Не уверен, что обувь [аналогия] подходит. - person Jimbo Jonny; 26.01.2016

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

Так же, как <script defer> рассматривается как <script defer="defer">, <script /> рассматривается как <script /="/">.

person rpetrich    schedule 16.09.2008
comment
Каким бы элегантным ни было это объяснение, на самом деле оно неверно. Если бы это было правдой, для элемента скрипта в DOM был бы атрибут /. Я проверил IE, Firefox и Opera, и ни один из них не содержит такого атрибута. - person Alohci; 22.02.2009
comment
/ не является допустимым символом имени атрибута, поэтому он отбрасывается. В остальном это объяснение довольно ясное. - person hallvors; 17.08.2012
comment
Фактически, некоторые парсеры HTML (и особенно валидаторы) могут интерпретировать / как часть конструкции NET (Null End Tag). - person IS4; 08.11.2016

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

«Краткая форма» XML интерпретируется как атрибут с именем /, который (из-за отсутствия знака равенства) интерпретируется как имеющий неявное значение /. Это совершенно неправильно в HTML 4.01 - необъявленные атрибуты не разрешены, но браузеры проигнорируют это.

IE9 и более поздние версии поддерживают XHTML 5, обслуживаемые с application/xhtml+xml.

person Mike Dimmick    schedule 16.09.2008
comment
IE 9 поддерживает XHTML и IE больше не ›51%. Не могли бы вы обновить свой ответ? - person Damian Yerrick; 13.03.2015

Это потому, что SCRIPT TAG не является недействительным элементом.

В HTML-документе - НЕПРАВИЛЬНЫЕ ЭЛЕМЕНТЫ не нуждаются в "закрывающем теге" вообще!

В xhtml все является универсальным, поэтому всем им требуется завершение, например. «закрывающий тег»; Включая br, простой перенос строки, как <br></br> или его сокращение <br />.

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

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

Семантика <H1> не может быть прервана следующей <P>, потому что она не несет достаточного количества собственной семантики для переопределения и, следовательно, завершения предыдущего набора инструкций H1. Хотя он сможет разбить поток на новую строку абзаца, он не «достаточно силен», чтобы переопределить текущий размер шрифта и стиль line-height , перетекающий в поток , т.е. утечка из H1 (потому что у P его нет).

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

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

Так родилось понятие обертки, т. Е. Контейнера. (Эти понятия настолько похожи, что их невозможно различить, и иногда один и тот же элемент может иметь и то, и другое. <H1> одновременно является и оболочкой, и контейнером. В то время как <B> только семантическая оболочка). Нам понадобится простой контейнер без семантики. И, конечно же, было изобретено DIV Element.

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

Поскольку с помощью CSS вы можете легко переопределить собственное поведение BR до и после BR недавно изобретенного DIV, его часто называют «контейнером ничего не делать». Что, естественно, неверно! DIV - это блочные элементы, которые изначально разрывают строку потока как до, так и после сигнализации конца. Вскоре WEB начал страдать от страницы DIV-itis. Большинство из них все еще есть.

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

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

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

Цель HTML - передавать значимые данные человеку-получателю.

Доставить информацию.

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

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

person Bekim Bacaj    schedule 17.08.2017
comment
Я думал, что цель HTML - передавать данные агенту (обычно браузеру), то есть человеку. - person David Spector; 03.05.2021

Простой современный ответ заключается в том, что тег обозначен как обязательный таким образом

Пропуск тега Нет, и начальный, и конечный тег являются обязательными.

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script

person Mark Schultheiss    schedule 10.11.2019
comment
Не имеет смысла, если указан атрибут src. Но я думаю, это упрощает анализ HTML. - person David Spector; 03.05.2021

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

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! под текстовым полем.

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

person myf    schedule 22.11.2017