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

StackOverflow https://stackoverflow.com/questions/69913

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

Однако отправка XML-mimetype приведет к тому, что ваши страницы не будут анализироваться 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-пролог или doctype внутри вашего документа - Firefox разветвляется, как только получает text/html заголовок, который определяет, просматривает ли анализатор HTML или XML внутри документа, а анализатор HTML не понимает <script />.

На случай, если кому-то интересно, конечная причина заключается в том, что HTML изначально был диалектом SGML, который является странным старшим братом XML.В SGML-land элементы могут быть указаны в DTD либо как самозакрывающиеся (напримерBR, HR, ВХОДНЫЕ данные), неявно закрываемые (например,P, LI, TD) или явно закрываемый (например,ТАБЛИЦА, DIV, СКРИПТ).XML, конечно, не имеет об этом никакого понятия.

Анализаторы тегов, используемые современными браузерами, развились из этого наследия, хотя их модель синтаксического анализа больше не является чистым 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 имеет некоторые короткие теги, такие как <BR//, <B>text</>, <B/text/, или <OL<LI>item</LI</OL>.XML принимает первую форму, переопределяет окончание как ">" (SGML является гибким), так что оно становится <BR/>.

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

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

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

И <script>конечный тег - это не является необязательным.

Тег "Self-ending" является взломом в 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> это один из тегов, в котором реализации раньше отличались друг от друга.IT раньше работал в Chrome, Safari, и Опера;насколько мне известно, это никогда не работало в Internet Explorer или Firefox.

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

После выхода черновика WebKit обновил синтаксический анализатор, чтобы привести его в соответствие.

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


XHTML 1 / XHTML 5

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

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

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

Итак, что же произошло?

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

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

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

Наконец, оказывается, что W3C я не имел в виду, что XHTML можно обнюхивать:этот документ является и то , и другое, 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 вообще не будет отображать документ!

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

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

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

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

<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.Вы можете использовать короткий синтаксис только с любым элементом, который позволяет опустить закрывающий тег.Смотрите на Спецификация HTML 4.01.

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

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

Это потому, что ТЕГ SCRIPT не является ЭЛЕМЕНТОМ VOID.

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

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

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

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

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

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

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

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

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

Поскольку с помощью CSS вы могли бы легко переопределить собственное поведение до и после BR недавно изобретенного DIV, его часто называют "контейнером ничего не делать".Что, естественно, неправильно!DIVS являются блочными элементами и изначально разрывают строку потока как до, так и после окончания подачи сигнала.Вскоре ИНТЕРНЕТ начал страдать от разделения страниц.Большинство из них до сих пор таковыми являются.

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

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

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

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

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

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

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

Разница между 'true XHTML', 'faux 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) расширение (спасибо, Алек, за этот намек).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top