По какой причине браузеры неправильно распознают:
<script src="foobar.js" /> <!-- self-closing script element -->
Только это признается:
<script src="foobar.js"></script>
Это нарушает концепцию поддержки XHTML?
Примечание: это утверждение верно по крайней мере для всех IE (6-8 бета 2).
javascript
html
internet-explorer
xhtml
dimarzionist
источник
источник
Ответы:
Спецификация XHTML 1 гласит:
С.3. Минимизация элементов и содержание пустых элементов
DTD XHTML определяет элементы сценария как:
источник
<script />
не в том, что спецификация запрещает его, а в том, что браузеры не интерпретируют его как «non-tag-soup», если тип контента не application / xhtml + xml. См .: stackoverflow.com/questions/348736/… @shabunc: могут показаться , что браузеры это понимают, но на самом деле происходит размещение содержимого после <p /> внутри абзаца, поскольку интерпретация цитаты squadette означает, что с < p> не пустой, он не может быть самозакрывающимся. В XHTML 1.1 он может быть самозакрывающимся.Чтобы добавить к тому, что сказали Брэд и Сквадетт, самозакрывающийся синтаксис XML на
<script />
самом деле является правильным XML, но для того, чтобы он работал на практике, вашему веб-серверу также необходимо отправить ваши документы в виде правильно сформированного XML с миметипом XML, какapplication/xhtml+xml
в HTTP Заголовок Content-Type (а не какtext/html
).Однако, отправка mimetype XML приведет к тому, что IE7 не будет анализировать ваши страницы, что только нравится
text/html
.С w3 :
Я ломал голову над этим несколько месяцев назад, и единственным работоспособным (совместимым с FF3 + и IE7) решением было использование старого
<script></script>
синтаксиса сtext/html
(HTML syntax + HTML mimetype).Если ваш сервер отправляет
text/html
тип в своих заголовках HTTP, даже если документы XHTML правильно сформированы иным образом, FF3 + будет использовать режим отображения HTML, что означает, что<script />
он не будет работать (это изменение, ранее Firefox был менее строгим).Это будет происходить независимо от того, какие возни с
http-equiv
метаэлементами, прологом XML или документом внутри вашего документа - Firefox разветвляется после того, как получаетtext/html
заголовок, который определяет, будет ли парсер HTML или XML заглядывать внутрь документа, а парсер HTML не понимает<script />
.источник
.html
отображать локальные файлы в виде тега-супа независимо от мета-тегов по аналогичным причинам. Для файлов XHTML Firefox будет отображать их соответствующим образом, только если они названы.xhtml
.application/xhtml+xml
, а неtext/xml
.В случае, если кому-то интересно, окончательная причина в том, что HTML изначально был диалектом SGML, который является странным старшим братом XML. В земле SGML элементы могут быть определены в DTD как самозакрывающиеся (например, BR, HR, INPUT), неявно закрываемые (например, P, LI, TD) или явно закрываемые (например, TABLE, DIV, SCRIPT). XML, конечно, не имеет понятия об этом.
Парсеры тег-супа, используемые современными браузерами, развились из этого наследия, хотя их модель синтаксического анализа больше не является чистым SGML. И, конечно же, ваш тщательно созданный XHTML рассматривается как плохо написанный SGML-вдохновленный тег-суп, если вы не отправите его с типом mime XML. Это также почему ...
... интерпретируется браузером как:
... что является рецептом для милой непонятной ошибки, которая может привести вас в ярость, когда вы пытаетесь кодировать против DOM.
источник
P
элемент не может содержатьDIV
элементы (это недопустимый HTML), поэтому браузер неявно закрываетP
элемент (определенный как «неявно закрываемый ») перед открывающимDIV
тегом. Однако браузеры, как правило, ведут себя по-разному в этом отношении (как они могут поступать с любым недопустимым HTML).</p>
другой стороны, отсутствующий конечный тег фактически является частью определения HTML!Другие ответили «как» и процитировали спец. Вот реальная история «почему нет
<script/>
», после многих часов копания в отчетах об ошибках и списках рассылки.HTML 4
HTML 4 основан на SGML .
SGML имеет некоторый shorttags , такие как
<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 имеет пять типов тегов, и только «пустые» и «внешние» теги могут быть самозакрывающимися .
Поскольку
<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 разрабатывался и был отклонен, потому что он нарушает совместимость браузера . Веб-страницы, которые автоматически закрывают тег сценария, могут отображаться некорректно (если вообще) в старых браузерах. Были и другие предложения , но они также не могут решить проблему совместимости.
После того, как черновик был выпущен, WebKit обновил синтаксический анализатор до соответствия.
Самозакрытие
<script>
не происходит в HTML 5 из-за обратной совместимости с HTML 4 и XHTML 1.XHTML 1 / XHTML 5
Когда действительно служил XHTML,
<script/>
он действительно закрыт, как утверждают другие ответы .За исключением того, что спецификация говорит, что это должно работать, когда используется как HTML:
Так что случилось?
Люди попросили Mozilla , чтобы позволить Firefox разобрать , соответствующие документы в XHTML , независимо от указанного содержания заголовка (известного как фырканье контента ). Это позволило бы самозакрывающимся сценариям, и в любом случае необходим анализ содержимого, поскольку веб-хостеры не были достаточно зрелыми, чтобы обслуживать правильный заголовок; IE был хорош в этом .
Если первая война браузеров не закончилась с IE 6, возможно, XHTML также был в списке. Но это закончилось. И IE 6 имеет проблемы с XHTML. На самом деле IE не поддерживает правильный тип MIME вообще , заставляя всех использовать
text/html
для XHTML , потому что IE провел значительную долю рынка в течение целого десятилетия.А также прослушивание контента может быть очень плохим, и люди говорят, что его следует остановить .
Наконец, оказывается, что W3C не подразумевал, что XHTML может быть сниффином : документ - это и HTML, и XHTML, и
Content-Type
правила. Можно сказать, что они твердо стояли на «просто следуйте нашим спецификациям» и игнорировали то, что было практичным . Ошибка, которая продолжалась в более поздних версиях XHTML.Так или иначе, это решение решило вопрос для Firefox. Прошло 7 лет, прежде чем Chrome родился ; не было другого значимого браузера. Так было решено.
Только указание типа документа не вызывает синтаксический анализ XML из-за следующих спецификаций.
источник
<p>
или<li>
, не могут быть «самозакрытыми», так как они могут иметь контент, поэтому код подобен<p/>
не более, чем (неправильно сформированный) начальный тег и содержимое после него, если это разрешено в этом элементе , в конечном итоге внутри него.Internet Explorer 8 и более ранние версии не поддерживают синтаксический анализ XHTML. Даже если вы используете декларацию XML и / или тип документа XHTML, старый IE все равно анализирует документ как обычный HTML. А в простом HTML самозакрывающийся синтаксис не поддерживается. Конечная косая черта просто игнорируется, вы должны использовать явный закрывающий тег.
Даже браузеры с поддержкой синтаксического анализа XHTML, такие как IE 9 и более поздние версии, все равно будут анализировать документ как HTML, если вы не предоставите документ с типом содержимого XML. Но в этом случае старый IE не будет отображать документ вообще!
источник
Вышеупомянутые люди уже в значительной степени объяснили эту проблему, но одна вещь, которая может прояснить ситуацию, заключается в том, что, хотя люди используют
<br/>
и такое все время в HTML-документах, любое/
в таком положении в основном игнорируется и используется только при попытке сделать что-то и разбирается как XML и HTML. Попробуйте<p/>foo</p>
, например, и вы получите обычный абзац.источник
Самозакрывающийся тег сценария не будет работать, поскольку тег сценария может содержать встроенный код, а HTML недостаточно умен, чтобы включать или отключать эту функцию в зависимости от наличия атрибута.
Если вы хотите, чтобы тег script был самодостаточным, вы не можете сделать это, как я уже сказал, но есть альтернатива, хотя и не разумная. Вы можете использовать самозакрывающийся тег link и ссылку на свой JavaScript, задав ему тип text / javascript и rel as script, что-то вроде ниже:
источник
<style>
теги, но мы используем теги ссылок для внешних CSS-файлов. Определение тега ссылки: « Тег <link> определяет ссылку между документом и внешним ресурсом». Кажется совершенно логичным, что тег link будет использоваться для внешних CSS или JS ... это то, для чего он ... ссылки во внешних файлах. обратите внимание, я не говорю о спецификации / кросс-браузерности / и т.д., я просто комментирую логическую природу использования тегов ссылок для ввода как CSS, так и JS ... на самом деле было бы много смысла, если бы это было так , Не уверен, что обувь [аналогия] подходит.В отличие от XML и XHTML, HTML не знает самозакрывающегося синтаксиса. Браузеры, которые интерпретируют XHTML как HTML, не знают, что
/
символ указывает, что тег должен быть самозакрывающимся; вместо этого они интерпретируют его как пустой атрибут, и синтаксический анализатор все еще думает, что тег «открыт».Так же, как
<script defer>
лечится, так<script defer="defer">
и<script />
лечится, как<script /="/">
.источник
/
как часть конструкции NET (Null End Tag).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
.источник
Это потому, что TAG СКРИПТА не является пустым элементом.
В HTML-документе - VOID ELEMENTS вообще не нужен закрывающий тег!
В xhtml все является универсальным, поэтому все они требуют завершения, например, «закрывающий тег»; В том числе br, простой перенос строки, как
<br></br>
или его стенография<br />
.Однако элемент Script никогда не является пустым или параметрическим элементом, потому что тег script, прежде всего, является инструкцией браузера, а не объявлением описания данных.
В принципе, инструкция семантического завершения, например, «закрывающий тег», требуется только для обработки инструкций, семантика которых не может быть завершена последующим тегом. Например:
<H1>
семантика не может быть прервана следующим,<P>
потому что она не несет достаточно своей собственной семантики, чтобы переопределить и, следовательно, завершить предыдущий набор команд H1. Несмотря на то, что он сможет разбить поток на новую строку абзаца, он недостаточно «силен», чтобы переопределить текущий размер шрифта и высоту стиля строки, стекающую по потоку , то есть вытекающую из H1 (потому что у P его нет ).Вот как и почему была изобретена сигнализация "/" (завершение).
Общий тег завершения без описания, подобный
< />
, был бы достаточен для любого отдельного падения встречного каскада, например:<H1>Title< />
но это не всегда так, потому что мы также хотим иметь возможность «вложения», множественных промежуточных тегов потока: split в торренты, прежде чем обматывать / падать на другой каскад. Как следствие, общий терминатор, такой как< />
, не сможет определить цель свойства для завершения. Например:<b>
полужирный<i>
полужирный< />
курсив</>
нормальный. Несомненно, не сможет правильно понять наше намерение и, скорее всего, будет истолковывать его как полужирный полужирный шрифт полужирный нормальный.Так родилось понятие обертки, т. Е. Контейнера. (Эти понятия настолько похожи, что их невозможно различить, и иногда один и тот же элемент может иметь и то и другое.
<H1>
Является и оболочкой, и контейнером одновременно. Тогда как<B>
только семантическая оболочка). Нам понадобится простой контейнер без семантики. И, конечно, изобретение элемента DIV пришло.Элемент DIV на самом деле является 2BR-контейнером. Конечно, появление CSS сделало всю ситуацию более странной, чем могло бы быть, и вызвало большую путаницу со многими великими последствиями - косвенно!
Поскольку с помощью CSS вы можете легко переопределить нативное поведение до и после BR недавно изобретенного DIV, его часто называют «контейнером бездействия». Что, естественно, неправильно! DIVs являются блочными элементами и будут изначально прерывать линию потока как до, так и после сигнализации окончания. Вскоре в сети начали страдать страницы DIV-itis. Большинство из них до сих пор.
Появление CSS с его способностью полностью переопределить и полностью переопределить нативное поведение любого HTML-тега, каким-то образом сумело запутать и затуманить весь смысл существования HTML ...
Внезапно все HTML-теги выглядели как устаревшие, они были испорчены, лишены всего их первоначального значения, идентичности и цели. Каким-то образом у вас сложится впечатление, что они больше не нужны. Говоря: одного тега контейнера-обертки будет достаточно для всего представления данных. Просто добавьте необходимые атрибуты. Почему бы не иметь значимые теги вместо этого; Придумайте имена тегов по мере необходимости и позвольте CSS возиться с остальными.
Вот как родился xhtml и, конечно, великий тупой, столь дорого заплативший новичкам и искаженное видение того, что к чему, и какова чертова цель всего этого. W3C перешел из World Wide Web в "Что пошло не так, товарищи?"
Цель HTML - передавать значимые данные человеку-получателю.
Для доставки информации.
Формальная часть предназначена только для обеспечения ясности доставки информации. xhtml не дает ни малейшего рассмотрения информации. - Для него информация абсолютно неактуальна.
Самое важное в этом вопросе - это знать и понимать, что xhtml - это не просто версия какого-то расширенного HTML , xhtml - это совершенно другой зверь; обосновывается; и поэтому разумно держать их отдельно.
источник
Разница между 'true XHTML', 'faux XHTML' и HTML, а также важность типа MIME, отправляемого сервером, уже хорошо описана здесь . Если вы хотите попробовать это прямо сейчас, вот простой редактируемый фрагмент с предварительным просмотром в реальном времени, включая самозакрывающийся тег сценария для браузеров с поддержкой:
Вы должны увидеть
Hello, true XHTML. Nice to meet you!
ниже текстовую область.Для неспособных браузеров вы можете скопировать содержимое текстовой области и сохранить его в виде файла с
.xhtml
(или.xht
) расширением ( спасибо Алеку за эту подсказку ).источник
Просто современный ответ таков: тег обозначается как обязательный
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script
источник