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

В чем причина некорректного распознавания браузерами:

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

Распознается только это:

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

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

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

Комментарии к вопросу (14)
Решение

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

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

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

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


Комментарии (10)

Добавить к тому, что Брэд и squadette уже говорили, самозакрывающиеся синтаксиса XML <сценарий /&ГТ; на самом деле это корректный XML, но для того, чтобы работать на практике, ваш веб-сервер должен отправить ваши документы Как правильно сформированный XML с XML-тип как приложение/с xhtml+xml с в HTTP-заголовке типа контента (и не как текст/HTML).

Однако, отправляя XML-файл типа приведет ваши страницы, чтобы не быть проанализирован ИЕ7, который любит только текст/HTML.

От В3:

В резюме, 'заявление/с xhtml+xml и#39; &ГТ; должны быть использованы для XHTML семьи &ГТ; документы, и использовать 'текст/HTML' &ГТ; должны быть ограничены в HTML-совместимые &ГТ; документы XHTML 1.0. 'приложение/XML' > и 'текст/XML' может также использоваться, но По мере необходимости &ГТ; 'заявление/с xhtml+xml и#39; следует применять &ГТ; а не те родовые XML-медиа &ГТ; типы.

Я ломал голову над этим несколько месяцев назад, и единственный работоспособный (совместимо с ФФ3+ и IE7) решением было использовать старый в <сценарий></скрипт&ГТ; синтаксис с текст/HTML (синтаксис html + html по умолчанию.).

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

Это будет происходить независимо от каких-либо махинаций с HTTP-экв мета-элементов, пролог или установлен внутри документа -- в Firefox ветки после того, как он получает текст/HTML Заголовок, который определяет, является ли HTML или XML парсер выглядит внутри документа и HTML-парсер не понимает <сценарий /&ГТ;.

Комментарии (4)

В случае, если кто'ы любопытно, основная причина заключается в том, что HTML был изначально диалект языка SGML, который является XML's странно старший брат. В SGML-земля, элементы могут быть определены в DTD как самозакрывания (например, БР, ЛР, входные), неявно закрывающиеся (например, литий, ТД), или явно закрывающиеся (например, стол, див, сценарий). Конечно, XML имеет никакого понятия об этом.

Тег-суп парсеров используются современные браузеры эволюционировали из этого наследия, хотя их анализа модели разве'т чистого SGML и больше. И конечно тщательно продуманной XHTML-это считается плохо-написано в SGML-вдохновил тег-суп, если вы не отправить его с типом XML мим. Это также, почему...

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

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

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

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

Комментарии (6)

Другие дали ответ "как" и цитирует спецификаций. Вот реальная история "Почему нет<сценарий/&ГТ; в`", после многих часов копания в отчетах ошибок и списки рассылки.

В HTML 4 В HTML 4 основано на СОЯР. SGML имеет некоторые shorttags, такие как &ЛТ;БР/&/, &ЛТ;Б>текст</&ГТ;, &ЛТ;Б/текста/, или в <Ольга&ЛТ;ли&ГТ;пункт&ЛТ;/л.&ЛТ;/ол&ГТ;. В XML принимает первую форму, определяет окончание как "&ГТ;" и (SGML-это гибкая), так что она становится &ЛТ;БР/&ГТ;. Однако, HTML-код не redfine, так <сценарий/&ГТ; должны среднее <сценарий&ГТ;&ГТ;. &ЛТ;БР&ГТ; (Да, '&ГТ;' должна быть частью содержания, а тег до сих пор не закрыта.) Очевидно, что это несовместимо с XHTML и будет перерыв много сайтов (когда браузеры были достаточно зрелыми уход о), так что никто не реализовал shorttags]6 и спецификация советует против них. Эффективно, все 'работает' самостоятельная состава, теги-это теги с запрещенным конечным тегом на технически несовместимой Парсеры и по сути неверный. Он был консорциума W3C который придумал этот хак]8, чтобы помочь переход на XHTML, сделав его HTML-совместимые. И в <сценарий>'закрывающий тег S является не запрещено. "по собственной заканчивая" и тег Хак в HTML 4 и бессмысленно.

По HTML 5 HTML5 имеет пять типов теги и только 'пустоты' и 'и#39; теги позволено быть самозакрывающимися. Потому что в <сценарий> - Это не пустота (это *может* иметь содержание), а не внешней (как в MathML и SVG),<сценарий и GT;не может быть самозакрывающимися, независимо от того, как вы его используете. Но почему? Может&#39;t они расценивают это как иностранные, делают особый случай, или что-то? В HTML 5 стремится быть [совместима][13] с *реализации* в HTML 4 и XHTML 1. Он не основан на SGML или XML; его синтаксис, в основном, связаны с документированием и объединение реализаций. (Вот почему&ЛТ;БР/&ГТ;`&ЛТ;ч/&ГТ; и т. д. являются действительными HTML 5][14] несмотря на то, что недействительные HTML4.) Самозакрывающиеся&ЛТ;сценарий> - Это один из тегов, где реализации отличаются. Он работал в Хроме, сафари, и опера; насколько мне известно, он никогда не работал в Internet Explorer или Firefox. Об этом шла речь, когда HTML 5 была разработана и получила отказ, потому что перерывы браузер сочетаемость. Веб-страницы, самостоятельное закрытие тега script не может сделать правильно (если вообще) в старых браузерах. У меня также были и другие предложения]21, но они могут'т решить проблему совместимости либо. После того, как проект был опубликован, в WebKit обновлен парсер должен быть в соответствии. Самозакрывающаяся <сценарий и GT; не бывает в HTML 5 из-за обратной совместимости с HTML 4 и XHTML 1.

В XHTML 1 / С XHTML 5 Когда действительно подается как XHTML, <сценарий/&ГТ; действительно закрыт, как прочие ответы обьявили. Кроме того, что спецификации он должен работал, когда служил в HTML: &ГТ; документы XHTML ... могут быть помечены с типа Интернет-СМИ "текст/HTML" и [RFC2854], поскольку они совместимы с большинством браузеров и HTML. Итак, что случилось? Человек спросил Мозилла]24 в позволить Firefox разбор подтверждающие документы как с XHTML независимо от указанного заголовка контента (известный как нюхают содержание). Это позволило бы в любом случае самозакрывающиеся скрипты, и контент нюхают необходимо, потому что веб-хостеры не были достаточно зрелыми, чтобы служить правильный заголовок; т. е. было хорошо. Если первая война браузеров это'т конец с IE 6, XHTML может быть в списке тоже. Но она кончилась. И IE 6 есть проблема с XHTML. На самом деле т. е. не поддерживаю правильный тип MIME на всех, принуждение все, чтобы использовать текст/HTML для XHTML потому что IE провела крупный рынок акций в течение целого десятилетия. А также содержание нюхают может быть очень плохой и люди говорят, что это должно быть остановлено. Наконец, оказывается, что, W3C я'т имею в виду XHTML в sniffable: документ оба, HTML и XHTML, и тип содержимого правила. Можно сказать, они были твердо стоя на "просто следите за нашими спец" и не замечают того, что практическая. Ошибка, что продолжение в дальнейшем в XHTML версии. В любом случае, это решение урегулировала вопрос для Firefox. Это было 7 лет перед хром родился; там не было никаких других существенных браузера. Таким образом было принято решение. Указав только тип документа не вызывает разбора XML из-за следующих характеристик.

Комментарии (12)

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

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

Комментарии (3)

Люди выше уже довольно много, объяснил проблему, но одна вещь, которая может сделать вещи ясно, что, хотя люди используют &ЛТ;БР/&ГТ; и такие все время в HTML-документах, либо/в таком положении в основном игнорируется, и используется только тогда, когда пытается сделать что-то для анализа как XML и HTML. Попробуйте в<Р/&ГТ;фу&ЛТ;/п&ГТ;`, например, и вы получаете регулярный пункт.

Комментарии (0)

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

&ГТ; с другой стороны, в HTML есть отличный тег для включения &ГТ; ссылки на внешние ресурсы: в `<ссылка> тег, и он может быть &ГТ; self-закрытия. Это's уже используется для включения стилей, RSS и Atom &ГТ; кормит, канонические URI, и всякие другие вкусности. Почему не &ГТ; в JavaScript?

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

Комментарии (3)

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

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

Комментарии (3)

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

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

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

Комментарии (1)

Что's, потому что тег script-это не пустота элемент.

В HTML-документа - недействительным элементов не А "и закрывающим тегом" и вообще!

В с XHTML, все являются универсальными, поэтому их всех надо прекращении например, А "закрывающий тег", У; в том числе СП., простой разрыв строки, как &ЛТ;БР&ГТ;&ЛТ;/БР&GT; или его *стенография*&ЛТ;БР /&ГТ;`.

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

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

в <Н1&ГТ; семантика не может быть расторгнут по следующим &ЛТ;П&ГТ; потому что это не'т нести достаточно своей собственной семантики, чтобы переопределить и поэтому завершить предыдущий Н1 набор команд. Хотя он сможет сломать поток в новый пункт линия, это не "силач достаточно", чтобы переопределить присутствует размер шрифта и усилитель; стиль линии-высота льет ручьем я.е протекает от H1 (потому что P не'т иметь его).

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

Универсальный нет-описание прекращение тег в < /&ГТ;, было бы достаточно для любого отдельного упасть столкнулся каскад, например: в <Н1&ГТ;название&ЛТ; /&ГТ; но это&#39;s не всегда так, потому что мы тоже хотим быть способен на "гнездования" и несколько промежуточных меток потока: разделение на потоки перед обертыванием / падения на следующий каскад. Как следствие универсального Терминатора, такой как в< /&ГТ;не сможет определить цель собственность прекратить. Например:&ЛТ;б&ГТ;**жирный** в<я> У***жирный курсив*** в< /&ГТ;*курсив* в</&ГТ;`нормальный. Несомненно, не получить наше намерение правильное и наиболее вероятно, интерпретировать как жирный шрифт жирный-itallic жирный нормально.

Это как понятия из оболочки, т. е. контейнер родился. (Эти понятия настолько похожи, что невозможно различить, а иногда один и тот же элемент может иметь как. в <Н1&ГТ; является одновременно оболочкой и контейнером одновременно. В то время как `&ЛТ;Б&ГТ; только семантической оболочкой). Мы'Лл нужен простой, без контейнера семантики. И конечно изобретению элемент div пришел.

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

Ведь с помощью CSS можно легко переопределить родной перед&после поведения комне недавно изобретенной div, он часто упоминается, как-то "делать нечего контейнер и quot;. Который, естественно, не так! ДИВС являются блочными элементами и непосредственно разрыв линии потока как до, так и после окончания сигнализации. Вскоре в Сети начали страдающих странице див-ИТИС. Большинство из них до сих пор.

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

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

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

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

Для доставки информации.

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

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

Комментарии (0)

Разница между 'правда в XHTML', 'искусственная с XHTML' и HTML, а также важность отправляемых сервером MIME-типом были уже описаны здесь][1]. Если вы хотите попробовать его прямо сейчас, здесь простой редактируемый фрагмент с предварительным просмотром, включая самостоятельную закрытый тег скрипт для браузера, способного:

в <!-- начинается фрагмент с JS скрывать: ложные консоли: ложные Бабеля: ложь --&ГТ;

div { display: flex; }
div + div {flex-direction: column; }

<div>Mime type: <input type="radio" onchange="t.onkeyup()" id="x" checked  name="mime"> application/xhtml+xml
<input type="radio" onchange="t.onkeyup()" name="mime"> text/html</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"?>



  <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!

  </p>
Комментарии (0)

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

и GT; тег упущение никто, как начальный и конечный тег обязателен.

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

Комментарии (0)