Почему конечные теги требуют времени, а иногда нет?

очень простой вопрос, но я не нашел для него ответа...

почему для некоторых тегов открытия/запуска html требуется тег закрытия/завершения?

например, <script> требует a </script>, а <img> может (на самом деле, должен) быть самозакрывающимся (<img src="path.jpg" />)?

Я предполагаю, что он имеет отношение к требованию содержимого между начальным и конечным тегами, но с примером <script>, <script src="file.js"></script> ничего не требуется между...

Я спрашиваю, потому что я сжег твердые два часа, пытаясь понять, почему мой включенный script работал в Safari, но не в FF или Chrome. это произошло потому, что я неправильно закрыл тег script. BLEH.

Ответ 1

Причиной существования закрывающих тегов является то, что у определенных элементов, естественно, никогда не будет контента, который проходит между тегами. Например, подумайте о теге <br /. Когда будет полезно что-то вроде <br></br>? Это просто пустая трата пространства и времени. Этот синтаксис проистекает из синтаксиса XML и стал частью XHTML.

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

Вот отличная статья о самозакрывающихся тегах в HTML5 (и прошлых версиях) для вашей справки.

http://tiffanybbrown.com/2011/03/23/html5-does-not-allow-self-closing-tags/

Ответ 2

Фактически допустимы HTML4 и HTML5, чтобы опустить большое количество конечных тегов (но не XHTML). Вот полный список: http://www.w3.org/TR/html5/syntax.html#optional-tags

Кроме того, существует несколько элементов void, которые просто не могут иметь никакого содержимого (например, img). Вот список таких: http://www.w3.org/TR/html5/syntax.html#void-elements

Что касается тегов script, есть хорошая дискуссия о переполнении стека об этом: Почему не работают самозакрывающиеся теги script?