'true XHTML','faux XHTML'和HTML之间的差异以及服务器发送的MIME类型的重要性已经already described here well . 如果你想立即试用,这里有一个简单的可编辑片段,带有实时预览,包括适用于浏览器的自闭脚本标签:
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>
您应该在textarea下方看到 Hello, true XHTML. Nice to meet you! .
11 回答
XHTML 1规范说:
С.3. Element Minimization and Empty Element Content
XHTML DTD将脚本标记指定为:
其他人已经回答"how"并引用了规范 . 这是真正的故事“为什么没有
<script/>
”,经过几个小时的挖掘bug报告和邮件列表 .HTML 4
HTML 4基于SGML .
SGML有一些shorttags,例如
<BR//
,<B>text</>
,<B/text/
或<OL<LI>item</LI</OL>
. XML采用第一种形式,将结尾重新定义为">"(SGML是灵活的),因此它变为<BR/>
.但是,HTML没有重新定义,所以
<SCRIPT/>
should mean<SCRIPT>>
.(是的,'>'应该是内容的一部分,标签仍然没有关闭 . )
显然,这与XHTML不兼容并且会破坏许多站点(当浏览器足够成熟时to care about this),所以nobody implemented shorttags和规范advises against them .
实际上,所有'working'自结束标签都是在技术上不符合的解析器上带有可选结束标签的标签,实际上是无效的 . 通过使它成为HTML-compatible来帮助过渡到XHTML的W3C是came up with this hack .
并且
<script>
的结束标记是not optional ."Self-ending" tag is a hack in HTML 4 and is meaningless.
HTML 5
HTML5有five types of tags,只有'void'和'foreign'标签是allowed to be self-closing .
因为
<script>
不是空的(它可能有内容)并且不是外来的(如MathML或SVG),所以<script>
无法自动关闭,无论您如何使用它 .但为什么?他们不能把它当作外国人,特殊情况或其他什么吗?
HTML 5的目标是backward-compatible与HTML 4和XHTML 1的实现 . 它不是基于SGML或XML;它的语法主要涉及记录和联合实现 . (这就是为什么
<hr/>
等是valid HTML 5尽管HTML4无效 . )自闭
<script>
是实现过去不同的标签之一 . 它used to work in Chrome, Safari,and Opera;据我所知,它从未在Internet Explorer或Firefox中运行 .This was discussed正在起草HTML 5并被拒绝,因为它breaks browser compatibility . 自动关闭脚本标记的网页可能无法在旧浏览器中正确呈现(如果有的话) . 有other proposals,但它们也无法解决兼容性问题 .
草稿发布后,WebKit更新了解析器以使其符合要求 .
Self-closing <script> does not happen in HTML 5 because of backward compatibility to HTML 4 and XHTML 1.
XHTML 1 / XHTML 5
当真正作为XHTML使用时,
<script/>
真正关闭,正如other answers所述 .除了the spec says,它应该在作为HTML提供时起作用:
所以发生了什么事?
无论指定的内容 Headers (称为content sniffing),人们都将asked Mozilla符合let Firefox parse符合文档XHTML . 这将允许自动关闭脚本和内容嗅探was necessary无论如何因为网络主机不够成熟以提供正确的 Headers ; IE是good at it .
如果first browser war没有以IE 6结尾,那么XHTML也可能在列表中 . 但它确实结束了 . 和IE 6 has a problem与XHTML . 实际上IE did not support正确的MIME类型at all,迫使每个人使用
text/html
for XHTML因为IE had major market share整整十年 .而且内容嗅探can be really bad并且人们正在说it should be stopped .
最后,事实证明W3C didn't mean XHTML to be sniffable:文档是HTML,XHTML和
Content-Type
规则 . 可以说他们在"just follow our spec"和ignoring what was practical上坚定不移 . continued在以后的XHTML版本中的错误 .无论如何,这个决定settled the matter适用于Firefox . 这是Chrome之前的7年was born;没有其他重要的浏览器 . 因此决定了 .
Specifying the doctype alone does not trigger XML parsing because of following specifications.
上面的人已经解释了这个问题,但有一件事情可以说清楚的是,虽然人们在
HTML
文档中一直使用'<br/>'
,但是这样一个位置的_161000基本上都被忽略了,只有在尝试时才会使用使_261001_和HTML
可解析的东西 . 例如,尝试'<p/>foo</p>'
,您将获得一个常规段落 .自闭脚本标记不起作用,因为脚本标记可以包含内联代码,并且HTML不够智能,无法根据属性的存在打开或关闭该功能 .
如果你想要的话脚本标签是自我封闭你不能像我说的那样做,但有一个替代,但不是一个聪明的 . 您可以使用自闭链接标记并通过为其提供一种text / javascript和rel作为脚本链接到您的JavaScript,如下所示:
与XML和XHTML不同,HTML不了解自动关闭语法 . 将XHTML解释为HTML的浏览器不知道
/
字符表示标签应该是自动关闭的;相反,他们将其解释为一个空属性,解析器仍然认为标签是'open' .正如
<script defer>
被视为<script defer="defer">
一样,<script />
被视为<script /="/">
.那是因为SCRIPT TAG不是VOID ELEMENT .
在HTML文档中 - VOID ELEMENTS do not 需要一个"closing tag"!
在xhtml中,一切都是通用的,因此它们都需要 termination ,例如a "closing tag";包括br,一个简单的换行符,如
<br></br>
或其简写
.但是,脚本元素永远不会是void或参数元素,因为脚本标记在其他任何内容之前是浏览器指令,而不是数据描述声明 .
原则上,语义终止指令(例如,“结束标签”)仅用于处理指令,其语义不能被后续标签终止 . 例如:
<H1>
语义不能被以下<P>
终止,因为它没有足够的自己的语义来覆盖并因此终止先前的H1指令集 . 虽然它能够将 stream 分成一个新的段落行,但它不会覆盖当前的字体大小和样式行高,即从H1泄漏(因为P没有它) .这就是为什么发明“/”(终止)信令的原因和原因 .
像
< />
这样的通用无描述终止标记对于遇到的级联的任何单一下降都是足够的,例如:<H1>Title< />
但情况并非总是如此,因为我们还希望能够"nesting",多个中间标记流:split在包裹/落入另一个级联之前进入种子 . 因此,诸如< />
之类的通用终结符将无法确定要终止的属性的目标 . 例如:<b>
bold<i>
bold-italic< />
italic</>
normal . 毫无疑问,我们的意图无法正确,并且很可能将其解释为正常 .这就是包装容器诞生的 notion 的方式 . (这些概念是如此相似以至于无法辨别,有时同一个元素可能同时具有这两个.
<H1>
同时是包装器和容器 . 而<B>
只是一个语义包装器) . 我们需要一个普通的,没有语义的容器 . 当然,DIV元素的发明也随之而来 .DIV元素实际上是2BR-Container . 当然,CSS的出现使得整个情况比其他情况更糟糕,并且造成了许多重大后果的巨大混乱 - 间接!
因为使用CSS,您可以轻松覆盖新发明的DIV的原生前后行为,它通常被称为“无所事事的容器” . 这是自然错的! DIV是块元素,并且在结束信令之前和之后将原生地断开流的线 . 不久,WEB开始遭受DIV-itis页面的困扰 . 他们中的大多数仍然是 .
CSS的出现能够完全覆盖并完全重新定义任何HTML标签的本机行为,以某种方式设法混淆和模糊HTML存在的整个含义......
突然间,所有HTML标签看起来都像是过时的,它们被污损,剥夺了它们所有的原始含义,身份和目的 . 不知怎的,你会得到他们不再需要的印象 . 说:单个容器包装标签就足以满足所有数据的呈现 . 只需添加所需的属性即可 . 为什么不使用有意义的标签;随时创建标签名称,让CSS打扰其余部分 .
这就是xhtml诞生的方式,当然也是一种直率的,是新来者付出的代价,以及对什么是什么的歪曲的看法,以及这一切的目的是什么 . W3C从万维网走到了什么错了,同志们?!!
HTML的目的是为人类收件人提供有意义的数据 .
提供信息 .
正式部分只是为了帮助清晰地传递信息 . xhtml没有对这些信息给予最轻微的考虑 . - 对它而言,信息绝对无关紧要 .
在这个问题上最重要的是知道并且能够理解 xhtml is not just a version of some extended HTML ,xhtml是一个完全不同的野兽;理由;因此 it is wise to keep them separate.
为了增加Brad和squadette所说的,自动关闭的XML语法
<script />
实际上是 is 正确的XML,但是为了在实践中工作,您的Web服务器还需要将您的文档作为正确形成的XML与XML一起发送mimetype类似于HTTP Content-Type标头中的application/xhtml+xml
(而不是text/html
) .但是,发送XML mimetype将导致您的页面不被IE7解析,IE7只喜欢
text/html
.从w3:
几个月前我对此感到困惑,唯一可行的(兼容FF3和IE7)解决方案是使用旧的
<script></script>
语法和text/html
(HTML语法HTML mimetype) .如果您的服务器在其HTTP标头中发送
text/html
类型,即使使用其他正确形成的XHTML文档,FF3也将使用其HTML呈现模式,这意味着<script />
将无效(这是一个更改,Firefox以前不那么严格) .无论是否在文档中使用
http-equiv
元标记,XML prolog或doctype,都会发生这种情况 - 一旦获得text/html
标头,Firefox就会分支,这将确定HTML或XML解析器是否在文档内部查看,而HTML解析器不会了解<script />
.'true XHTML','faux XHTML'和HTML之间的差异以及服务器发送的MIME类型的重要性已经already described here well . 如果你想立即试用,这里有一个简单的可编辑片段,带有实时预览,包括适用于浏览器的自闭脚本标签:
您应该在textarea下方看到
Hello, true XHTML. Nice to meet you!
.对于无法使用的浏览器,您可以复制textarea的内容并将其另存为
.xhtml
(或.xht
)扩展名(thanks Alek for this hint)的文件 .如果有人好奇,最终的原因是HTML最初是SGML的方言,这是XML的奇怪的哥哥 . 在SGML-land中,标签可以在DTD中指定为自闭(例如BR,HR,INPUT),隐式可关闭(例如P,LI,TD)或明确可关闭(例如TABLE,DIV,SCRIPT) . XML当然没有这个概念 .
现代浏览器使用的标签汤解析器是从这种遗产中演化而来的,尽管它们的解析模型不再是纯粹的SGML . 当然,除非您使用XML mime类型发送,否则您精心设计的XHTML将被视为编写得很糟糕的SGML风格的标签汤 . 这也是为什么......
...被浏览器解释为:
...这是一个可爱的模糊bug的配方,当你尝试对DOM进行编码时,它会让你陷入困境 .
Internet Explorer 8及更早版本不支持XHTML解析 . 即使您使用XML声明和/或XHTML doctype,旧的IE仍然将文档解析为纯HTML . 在纯HTML中,不支持自动关闭语法 . 只是忽略尾部斜杠,您必须使用显式结束标记 .
即使支持XHTML解析的浏览器(例如IE 9 and later)仍然会将文档解析为HTML,除非您使用XML内容类型提供文档 . 但在这种情况下,旧的IE将根本不显示文档!
Internet Explorer 8及更早版本不支持XHTML的正确MIME类型
application/xhtml+xml
. 如果您将XHTML作为text/html
提供,您必须为这些旧版本的Internet Explorer执行任何操作,它将被解释为HTML 4.01 . 您只能将短语法与允许省略结束标记的任何元素一起使用 . 见HTML 4.01 Specification .XML“简短形式”被解释为名为/的属性,其(因为没有等号)被解释为具有隐含值“/” . 这在HTML 4.01中是严格错误的 - 不允许使用未声明的属性 - 但浏览器会忽略它 .
IE9及更高版本support XHTML 5与
application/xhtml+xml
一起提供 .