浏览器无法正确识别的原因是什么:
<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兼容性指南”指出:
С.3元素最小化和空元素含量
给定内容模型不是空的元素的空实例(例如,空标题或段落),不要使用最小化形式(例如,使用<p></p>而不是<p>)。
XHTML DTD将脚本元素指定为:
<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
其他回答
InternetExplorer8和更早版本不支持XHTML、application/XHTML+xml的正确MIME类型。如果您将XHTML作为text/html提供服务,而这些旧版本的Internet Explorer必须这样做,那么它将被解释为html 4.01。您只能对允许省略结束标记的任何元素使用短语法。参见HTML 4.01规范。
XML“缩写”被解释为名为/的属性,该属性(因为没有等号)被解释为具有隐式值“/”。这在HTML 4.01中是完全错误的——不允许使用未声明的属性——但浏览器会忽略它。
IE9和更高版本支持与application/XHTML+xml一起提供的XHTML 5。
上面的人已经大致解释了这个问题,但有一点可能会让事情变得很清楚,尽管人们一直在HTML文档中使用<br/>等,但这种位置上的任何/基本上都被忽略了,只有在试图使某种东西既可解析为XML又可解析为HTML时才使用。例如,尝试<p/>foo</p>,就会得到一个常规段落。
“真XHTML”、“伪XHTML”和“普通HTML”之间的区别以及服务器发送的MIME类型的重要性在这里已经很好地描述了。
如果您想立即尝试,这里有一个简单的可编辑片段,带有实时预览,包括自关闭的脚本标记(请参见<script src=“data:text/javascript,/*functional*/”/>)和XML实体(不相关,请参见&x;)。
正如您所看到的,根据嵌入文档的MIME类型,数据URI JavaScript功能要么执行并显示连续文本(在application/xhtml+xml模式下),要么不执行并由脚本“吞噬”连续文本(以text/html模式下)。
div{display:flex;}div+div{flex direction:列;}<div>Mime类型:<label><input type=“radio”onchange=“t.onkeyup()”id=“x”checked name=“Mime”>application/xhtml+xml</label><label><inputtype=“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版本=“1.0”?><!DOCTYPE html PUBLIC“//W3C//DTD XHTML 1.0严格//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”>见鬼,没有:(</span>&x;。<script src=“data:text/javascript,(g=document.getElementById('greet')).innerText=g.getAttribute('swapto')”/>很高兴认识你!<!-- 上一个文本节点和所有其他内容在text/html模式下属于SCRIPT元素内容,因此不会呈现。因为没有找到结束脚本标记,所以没有脚本在text/html中运行--></p></body></html></textarea><iframe id=“i”height=“80”></iframe><script>t.onkeyup()</script></div>
您应该看到Hello,真正的XHTML。很高兴认识你!文本区域下方。
对于没有能力的浏览器,您可以复制文本区域的内容,并将其保存为扩展名为.xhtml(或.xht)的文件(感谢Alek的提示)。
自动关闭的脚本标记不起作用,因为脚本标记可以包含内联代码,而HTML不够聪明,无法根据属性的存在来启用或禁用该功能。
另一方面,HTML确实有一个很好的标记,用于包括对外部资源的引用:<link>标记,它可以是自动关闭。它已经用于包括样式表、RSS和Atom提要、规范URI和其他各种好东西。为什么不呢?JavaScript?
如果你想让脚本标签是自我封闭的,你不能像我所说的那样做,但有一个替代方案,尽管不是一个聪明的方案。您可以使用自动关闭的链接标记,并通过为其提供一种text/JavaScript和rel as脚本来链接到JavaScript,如下所示:
<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
如果有人好奇的话,最终的原因是HTML最初是SGML的一种方言,而SGML是XML奇怪的哥哥。在SGML land中,元素可以在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进行编码时,它会让您陷入困境。