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

1255
задан John 9 April 2019 в 03:58
поделиться

7 ответов

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

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

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

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

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
457
ответ дан John 9 April 2019 в 03:58
поделиться

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

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

От [1 111] w3:

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

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

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

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

228
ответ дан John 9 April 2019 в 03:58
поделиться

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

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

44
ответ дан Damian Yerrick 9 April 2019 в 03:58
поделиться

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

27
ответ дан neonblitzer 9 April 2019 в 03:58
поделиться

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

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

20
ответ дан Sebastian Zartner 9 April 2019 в 03:58
поделиться

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.

18
ответ дан Mike Dimmick 9 April 2019 в 03:58
поделиться

Если кому-то интересно, основная причина в том, что 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.

161
ответ дан 19 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: