为什么浏览器不能正确识别:
<script src="foobar.js" /> <!-- self-closing script element -->
只有这个被识别:
<script src="foobar.js"></script>
这会破坏XHTML支持的概念吗?
注意:至少对于所有IE浏览器(6-8 beta 2)来说,这个陈述是正确的。
为什么浏览器不能正确识别:
<script src="foobar.js" /> <!-- self-closing script element -->
只有这个被识别:
<script src="foobar.js"></script>
这会破坏XHTML支持的概念吗?
注意:至少对于所有IE浏览器(6-8 beta 2)来说,这个陈述是正确的。
XHTML 1规范的非规范性附录“HTML兼容性指南”指出:
如果给定一个内容模型不是
EMPTY
(例如,一个空的标题或段落)的元素的空实例,则不要使用最小化形式(例如,使用<p> </p>
而不是<p />
)。
XHTML DTD将脚本元素指定为:
<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
<script />
的问题不在于规范不允许使用它,而是如果内容类型不是 application/xhtml+xml
,浏览器不会将其解释为“非标签堆积”形式。参见:https://dev59.com/YnRC5IYBdhLWcg3wSu97#348818 @shabunc:浏览器可能看起来理解它,但实际上它会将 <p/>
标签后面的内容放到段落内部,因为它会把 squadette 的引语解释为由于 <p>
不为空,所以它不能是自闭合的。在 XHTML 1.1 中,它可以是自闭合的。 - Joe<script />
实际上是正确的XML格式,但要让它在实践中起作用,您的Web服务器还需要将文档作为XML正常格式发送,并在HTTP Content-Type头部中使用XML mimetype,例如application/xhtml+xml
(而不是text/html
)。text/html
。<script></script>
语法以及text/html
(HTML语法+ HTML mimetype)。text/html
类型的HTTP标头,FF3 +也会使用其HTML呈现模式,这意味着<script />
将无法工作(这是一种变化,Firefox以前不那么严格)。http-equiv
元素、文档内的XML prolog或doctype的情况下——Firefox在获取text/html
标头后就会分支,这就确定了HTML或XML解析器是否查看文档,并且HTML解析器不理解<script />
。.html
文件呈现为标签混乱的形式,原因类似。对于XHTML文件,只有在它们被命名为.xhtml
时,Firefox才会相应地呈现它们。 - alecovapplication/xhtml+xml
,而不是 text/xml
。 - TRiG其他人已经回答了“如何”并引用了规范。在经过数小时挖掘错误报告和邮件列表后,这里是“为什么没有<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>
的结束标签并不是被禁止的。
在HTML 4中,“自闭合”标签是一种hack,没有意义。
HTML 5
HTML5有五种标签类型,只有“void”和“foreign”标签可以自闭合。
因为<script>
不是void(它可能有内容),也不是foreign(像MathML或SVG一样),无论如何使用,<script>
都不能自闭合。
但为什么呢?他们不能将其视为foreign,做出特殊处理或其他吗?
HTML5旨在与HTML4和XHTML1的实现向后兼容。
它不基于SGML或XML;其语法主要涉及记录和统一实现。
(这就是为什么<br />
<hr />
等虽然无效HTML4,但仍然是有效的HTML5的原因)。
自闭合的<script>
是标记之一,实现曾经存在差异。
它曾经在Chrome、Safari中工作, 以及Opera;据我所知,在Internet Explorer或Firefox中从未工作。
当HTML 5起草时,曾讨论过此事,但被拒绝了,因为这会破坏 浏览器 兼容性。 自关闭脚本标记的网页可能在旧版浏览器中无法正确渲染(如果能渲染的话)。 虽然有其他提议,但它们也无法解决兼容性问题。
在起草版本发布后,WebKit更新了解析器以符合标准。
自关闭<script>
在HTML 5中不会发生,因为需要向后兼容HTML 4和XHTML 1。
XHTML 1 / XHTML 5
当真正作为XHTML时,<script/>
确实被关闭了,如其他答案所述。
但规范说明它在被作为HTML时也应该可用:
XHTML文档...可以被标记为“text/html”[RFC2854]的互联网媒体类型,因为它们与大多数HTML浏览器兼容。
那么,发生了什么事?
人们要求Mozilla让Firefox解析符合标准的文档,而不考虑指定的内容头部信息(即称为内容嗅探)是否正确。这将允许自闭合脚本,并且无论如何也需要进行内容嗅探,因为Web主机不能够成熟地提供正确的头部信息。IE在这方面做得很好(译注:指解析并渲染网页)。
如果第一次浏览器战争没有以IE 6结束,XHTML也可能在列表中。但它确实结束了。而IE 6 与XHTML有问题。
事实上,IE 根本不支持正确的MIME类型全部, 强制每个人使用text/html
来处理XHTML,因为IE在整整十年中占据了主要市场份额。
最后,事实证明W3C并不希望XHTML被探测:该文档是同时具有 HTML 和 XHTML,并遵循Content-Type
规则。可以说他们坚定地坚持“只需遵循我们的规范”,并且忽略了实际情况。这个错误一直延续到后来的XHTML版本。
无论如何,这个决定为Firefox解决了问题。在Chrome 出现之前还有7年时间,也没有其他重要的浏览器。因此就这样决定了。
仅指定DOCTYPE不会触发XML解析,因为要遵循规范。
<script>
作为一个允许自闭合的HTML5元素是独特的。我的第一条评论中所说的是,向后兼容性没有受到影响,因为向后兼容性是指旧代码在新浏览器中运行——在这种情况下是可以的。 - Andy E<p>
或<li>
,不能被“自闭合”,因为它们可以有内容,所以像<p/>
这样的代码只是一个(格式错误的)开始标签,如果允许在此元素中使用,则其后面的内容将最终出现在其中。 - Ilya Streltsyn如果有人感兴趣,根本原因在于HTML最初是SGML的一种方言,而SGML是XML的怪异老兄。在SGML领域中,元素可以在DTD中被指定为自闭合(例如BR,HR,INPUT),隐含可关闭(例如P,LI,TD)或显式可关闭(例如TABLE,DIV,SCRIPT)。当然,在XML中没有这个概念。
现代浏览器使用的标记解析器源自这个遗产,尽管它们的解析模型不再是纯SGML。当然,除非您用XML类型的mime类型发送它,否则您精心制作的XHTML将被视为糟糕编写的受SGML启发的标记语言。这也是为什么......
<p><div>hello</div></p>
浏览器将其解释为:
<p></p><div>hello</div><p></p>
...这是一个美妙的晦涩bug的配方,它在你尝试编写DOM代码时会让你陷入疯狂的状态。
</p>
闭合标签实际上是HTML定义的一部分! - Mr ListerInternet Explorer 8及更早版本不支持XHTML解析。即使您使用XML声明和/或XHTML doctype,旧版IE仍将文档解析为纯HTML。而在纯HTML中,自闭合语法不被支持。尾随斜杠只是被忽略了,您必须使用显式的闭合标签。
即使支持XHTML解析的浏览器(如IE 9及更高版本),除非您使用XML内容类型服务文档,否则它们仍会将文档解析为HTML。但在这种情况下,旧版IE根本不会显示该文档!
上面的人已经基本解释了这个问题,但可能会有一件事情让事情更加清晰,即使人们在HTML文档中经常使用<br/>
等,但在这种位置上的任何/
基本上都会被忽略,并且只有在尝试创建可解析为XML和HTML的内容时才会使用。例如,尝试<p/>foo</p>
,您将得到一个常规段落。
自闭合的脚本标签无法工作,因为脚本标签可以包含内联代码,并且HTML不能根据属性的存在与否来开启或关闭该功能。
另一方面,HTML确实有一个非常好的标签用于包含对外部资源的引用:<link>标签,而且它可以是自闭合的。它已被用于包括样式表、RSS和Atom订阅源、规范URI以及各种其他好东西。为什么不包括JavaScript呢?
如果你想要自闭合的脚本标签,就像我之前说过的那样是行不通的,但有一个替代方法,虽然不是很智能。你可以使用自闭合的链接标签,并通过将其类型设置为text/javascript和rel设置为script来链接到JavaScript,类似于下面的示例:
<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
<style>
标签,但在使用外部CSS文件时需要用到链接标签。链接标签的定义是:“<link>
标签定义文档与外部资源之间的链接。”所以用链接标签来引入外部CSS或JS似乎很合理...因为这就是它的作用——链接外部文件。请注意,我并不是在谈论规范/跨浏览器等问题,我只是评论了使用链接标签来引入CSS和JS的逻辑性...如果真是这样,这实际上是很有道理的。不确定这个鞋子[比喻]是否贴切。 - Jimbo Jonny与XML和XHTML不同,HTML没有自闭合语法的概念。将XHTML解释为HTML的浏览器并不知道/
字符表示标签应该是自闭合的;相反,他们将其解释为一个空属性,并且解析器仍然认为标签是“打开”的。
就像<script defer>
被视为<script defer="defer">
一样,<script />
被视为<script /="/">
。
Internet Explorer 8 及以前的版本不支持 XHTML 的正确 MIME 类型application/xhtml+xml
。如果你将 XHTML 以 text/html
格式提供,这些较旧版本的 Internet Explorer 只会将其解释为 HTML 4.01。你只能在任何允许省略闭合标签的元素中使用短语法。请参阅 HTML 4.01规范。
XML 的“短格式”被解释为一个名为“/”的属性,因为没有等号,所以被解释为具有隐含值“/”。严格来说,在 HTML 4.01 中这是不正确的——未声明的属性是不允许的,但浏览器会忽略它。
IE9 及更高版本支持以application/xhtml+xml
格式提供的XHTML 5。
<br></br>
或其简写形式<br />
。终止,因为它没有足够的自身语义来覆盖并因此终止前面的H1指令集。虽然它能够将流分裂成一个新的段落行,但它不足以覆盖当前字体大小和样式行高度从H1泄漏下来(因为P没有这个)。
< />
,对于任何单独的级联失效都足够了,例如:<H1>Title< />
,但这并不总是情况,因为我们还想能够“嵌套”,在流中分割成多个中间标记:在包裹/落入另一个级联之前分成几个部分。因此,通用终止器,如< />
,将无法确定要终止属性的目标。例如:<b>
bold <i>
bold-italic < />
italic </>
normal。毫无疑问,将无法正确理解我们的意图,并且很可能将其解释为bold bold-itallic bold normal。<H1>
既是包装器又是容器。而<B>
只是一个语义包装器。)我们需要一个普通的、没有语义的容器。当然,DIV元素的发明就来了。