javascript - хэштеги - хэштег примеры




Почему самозакрывающиеся скриптовые теги не работают? (8)

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

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

Только это признано:

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

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

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


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

В HTML-документе - VOID ELEMENTS не нужен «закрывающий тег» вообще!

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

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

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

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

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

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

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

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

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

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

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

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

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

Предоставить информацию.

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

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


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

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


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

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


В случае, если кому-то интересно, конечной причиной является то, что HTML изначально был диалектом SGML, который является странным старшим братом XML. В SGML-области теги могут быть указаны в DTD как самозакрывающиеся (например, BR, HR, INPUT), неявно закрывающиеся (например, P, LI, TD) или явно закрываемые (например, TABLE, DIV, SCRIPT). 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 имеет некоторые shorttags , такие как <BR// <B>text</> , <B/text/ или <OL<LI>item</LI</OL> . XML принимает первый вид, переопределяет окончание как «>» (SGML является гибким), поэтому он становится <BR/> .

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

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

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

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

Тег «Self-End» - это взломать HTML 4 и не имеет смысла.

HTML 5

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

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

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

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

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

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

После того, как проект был выпущен, 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 не означает, что XHTML может быть снижающим : в документе есть как HTML, так и XHTML, а также правила Content-Type . Можно сказать, что они стояли твердо на «просто следуйте нашей спецификации» и игнорируя то, что было практично . Ошибка, которая continued в более поздних версиях XHTML.

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

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


Различие между «истинным 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! Hello, true XHTML. Nice to meet you! ниже textarea.

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


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

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

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

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />

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

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

Из w3 :

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

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

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

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





xhtml