浏览器无法正确识别的原因是什么:
<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)都是正确的。
当前回答
除Brad和squadette所说的之外,自动关闭的XML语法<script/>实际上是正确的XML,但要使其在实践中发挥作用,web服务器还需要将文档作为格式正确的XML发送,并在HTTP Content Type标头中使用类似application/xhtml+XML的XML mimetype(而不是text/html)。
然而,发送XML mimetype将导致IE7无法解析页面,IE7只喜欢text/html。
来自w3:
总之,“application/xhtml+xml”应用于XHTML系列文档,以及“text/html”的使用应限于HTML兼容XHTML 1.0文档。'应用程序/xml'也可以使用“text/xml”,但是只要合适,应使用“application/xhtml+xml”而不是那些通用的XML媒体类型。
几个月前我对此感到困惑,唯一可行的(兼容FF3+和IE7)解决方案是使用旧的<script></script>语法和text/html(html语法+html mimetype)。
如果您的服务器在其HTTP头中发送text/html类型,即使是格式正确的XHTML文档,FF3+也将使用其html呈现模式,这意味着<script/>将无法工作(这是一个变化,Firefox以前没有那么严格)。
无论对文档中的http equiv元元素、XML序言或doctype进行任何篡改,都会发生这种情况——Firefox一旦获得text/html头,就会分支,这决定了html或XML解析器是否在文档中查找,而html解析器不理解<script/>。
其他回答
XHTML 1规范的非规范性附录“HTML兼容性指南”指出:
С.3元素最小化和空元素含量
给定内容模型不是空的元素的空实例(例如,空标题或段落),不要使用最小化形式(例如,使用<p></p>而不是<p>)。
XHTML DTD将脚本元素指定为:
<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
除Brad和squadette所说的之外,自动关闭的XML语法<script/>实际上是正确的XML,但要使其在实践中发挥作用,web服务器还需要将文档作为格式正确的XML发送,并在HTTP Content Type标头中使用类似application/xhtml+XML的XML mimetype(而不是text/html)。
然而,发送XML mimetype将导致IE7无法解析页面,IE7只喜欢text/html。
来自w3:
总之,“application/xhtml+xml”应用于XHTML系列文档,以及“text/html”的使用应限于HTML兼容XHTML 1.0文档。'应用程序/xml'也可以使用“text/xml”,但是只要合适,应使用“application/xhtml+xml”而不是那些通用的XML媒体类型。
几个月前我对此感到困惑,唯一可行的(兼容FF3+和IE7)解决方案是使用旧的<script></script>语法和text/html(html语法+html mimetype)。
如果您的服务器在其HTTP头中发送text/html类型,即使是格式正确的XHTML文档,FF3+也将使用其html呈现模式,这意味着<script/>将无法工作(这是一个变化,Firefox以前没有那么严格)。
无论对文档中的http equiv元元素、XML序言或doctype进行任何篡改,都会发生这种情况——Firefox一旦获得text/html头,就会分支,这决定了html或XML解析器是否在文档中查找,而html解析器不理解<script/>。
这是因为脚本标签不是无效元素。
在HTML文档中,VOID ELEMENTS根本不需要“结束标记”!
在xhtml中,所有内容都是通用的,因此它们都需要终止,例如“结束标记”;包括br,一个简单的换行符,如<br></br>或其简写<br/>。
然而,脚本元素永远不是空元素或参数元素,因为脚本标记先于其他元素,是浏览器指令,而不是数据描述声明。
原则上,语义终止指令(例如,“结束标记”)仅用于处理语义不能被后续标记终止的指令。例如:
<H1>语义不能被后面的<P>终止,因为它没有足够的自身语义来覆盖并因此终止前面的H1指令集。虽然它可以将流拆分为新的段落行,但它“不够强大”,无法覆盖当前的字体大小和样式行高度,即从H1泄漏(因为P没有)。
这就是为什么发明了“/”(终止)信令。
一个通用的无描述终止标记,如</>,对于遇到的级联中的任何一次跌落都是足够的,例如:<H1>标题</>,但情况并非总是这样,因为我们还希望能够“嵌套”流的多个中间标记:在包装/跌落到另一个级联之前拆分成种子。因此,像</>这样的通用终止符将无法确定要终止的属性的目标。例如:<b>bold<i>bold italic</>italic</>normal。毫无疑问,我们无法正确理解我们的意图,很可能会将其解释为大胆的大胆的意大利大胆的正常。
包装器即容器的概念就是这样诞生的。(这些概念非常相似,以至于无法识别,有时同一个元素可能同时具有这两者。<H1>同时是包装器和容器。而<B>只是一个语义包装器)。我们需要一个简单、无语义的容器。当然,DIV元素的发明也随之而来。
DIV元素实际上是一个2BR容器。当然,CSS的出现使整个情况变得更加奇怪,并造成了巨大的混乱和许多巨大的后果——间接的!
因为使用CSS,您可以很容易地覆盖新发明的DIV的本机前置和后置BR行为,所以它通常被称为“不做任何事情的容器”。这自然是错误的!DIV是块元素,并且在结束信令之前和之后都会本地中断流的线路。很快,WEB开始遭受页面DIV的困扰。他们中的大多数人仍然如此。
随着CSS的出现,它能够完全覆盖并完全重新定义任何HTML标记的本地行为,不知何故,它混淆并模糊了HTML存在的全部含义。。。
突然间,所有HTML标记都显得过时了,它们被污损了,失去了所有的原始含义、身份和用途。不知怎么的,你会觉得他们不再需要了。说:一个容器包装标签就可以满足所有数据表示。只需添加所需的属性。为什么不使用有意义的标签;边走边发明标签名,让CSS来处理剩下的。
这就是xhtml是如何诞生的,当然也是伟大的直言不讳,新来者付出了如此高昂的代价,对什么是什么以及这一切的该死的目的有着扭曲的看法。W3C从万维网变成了什么出了问题,同志们?!!
HTML的目的是将有意义的数据流传输给人类接收者。
传递信息。
正式部分只是为了帮助信息传递的清晰。xhtml丝毫没有考虑信息。-对它来说,这些信息是绝对无关的。
最重要的是要知道并能够理解xhtml不仅仅是某些扩展HTML的一个版本,xhtml是一个完全不同的野兽;磨碎;因此,将它们分开是明智的。
其他人回答了“如何”,并引用了规范。经过几个小时的研究,这里是“为什么不<script/>”的真实故事。
HTML 4
HTML4基于SGML。
SGML有一些短标记,例如<BR//、<B>text</>、<B/text/或<OL<LI>item</LI</OL>。XML采用第一种形式,将结尾重新定义为“>”(SGML是灵活的),因此它变成<BR/>。
然而,HTML并不是红色的,所以<SCRIPT/>应该意味着<SCRIPT>>。(是的,“>”应该是内容的一部分,标记仍然未关闭。)
显然,这与XHTML不兼容,并且会破坏许多网站(到浏览器成熟到可以考虑这一点时),因此没有人实现短标签,规范建议不要使用短标签。
实际上,所有“工作”的自结束标记都是在技术上不一致的解析器上带有禁止结束标记的标记,实际上是无效的。正是W3C想出了这个破解方法,通过使XHTML与HTML兼容来帮助过渡到XHTML。
<script>的结束标记不被禁止。
“Self-ending”标签是HTML4中的一个黑客,没有任何意义。
HTML 5
HTML5有五种类型的标记,只有“void”和“foreign”标记可以自动关闭。
因为<script>不是空的(它可能有内容),也不是外来的(像MathML或SVG),所以无论您如何使用<script>,它都不能自我关闭。
但为什么?难道他们不能把它看作是外国的吗?
HTML5旨在向后兼容HTML4和XHTML1的实现。它不是基于SGML或XML;它的语法主要涉及记录和合并实现。(这就是为什么<br/><hr/>等是有效的HTML5,而不是无效的HTML4。)
自我关闭<script>是过去实现不同的标记之一。它曾经在Chrome、Safari和Opera中运行;据我所知,它从未在Internet Explorer或Firefox中运行过。
这是在HTML5起草时讨论过的,因为它破坏了浏览器兼容性而被拒绝。在旧浏览器中,自关闭脚本标记的网页可能无法正确呈现(如果有的话)。还有其他建议,但它们也不能解决兼容性问题。
草案发布后,WebKit将解析器更新为一致。
由于向后兼容HTML4和XHTML1,HTML5中不会出现自动关闭<script>。
XHTML 1/XHTML 5
当真正用作XHTML时,<script/>实际上是关闭的,正如其他答案所述。
除了规范中说它应该在用作HTML时工作:
XHTML文档。。。可以标记为Internet媒体类型“text/html”[RFC2854],因为它们与大多数html浏览器兼容。
那么,发生了什么?
人们要求Mozilla允许Firefox将符合标准的文档解析为XHTML,而不考虑指定的内容头(称为内容嗅探)。这将允许自动关闭脚本,无论如何,内容嗅探都是必要的,因为web宿主还不够成熟,无法提供正确的标头;IE很擅长。
如果第一次浏览器大战没有以IE6结束,XHTML可能也在名单上。但它确实结束了。IE 6有XHTML的问题。事实上,IE根本不支持正确的MIME类型,迫使每个人都为XHTML使用text/html,因为IE占据了整整十年的主要市场份额。
此外,内容嗅探也可能非常糟糕,人们认为应该停止。
最后,事实证明,W3C并不意味着XHTML是可窥探的:文档既是HTML又是XHTML,以及内容类型规则。人们可以说,他们坚持“只遵循我们的规范”,而忽视了什么是实际的。这个错误一直延续到后来的XHTML版本。
无论如何,这个决定解决了Firefox的问题。Chrome诞生前7年;没有其他重要的浏览器。就这样决定了。
由于以下规范,单独指定doctype不会触发XML分析。
上面的人已经大致解释了这个问题,但有一点可能会让事情变得很清楚,尽管人们一直在HTML文档中使用<br/>等,但这种位置上的任何/基本上都被忽略了,只有在试图使某种东西既可解析为XML又可解析为HTML时才使用。例如,尝试<p/>foo</p>,就会得到一个常规段落。