Javascript 为什么不';自动关闭脚本元素不能工作吗?

Javascript 为什么不';自动关闭脚本元素不能工作吗?,javascript,html,internet-explorer,xhtml,Javascript,Html,Internet Explorer,Xhtml,浏览器无法正确识别的原因是什么: <script src="foobar.js" /> <!-- self-closing script element --> 只有这一点得到承认: <script src="foobar.js"></script> 这是否打破了XHTML支持的概念 注意:此声明至少对所有IE(6-8 beta 2)都是正确的。XHTML1规范说明: 给定内容模型不是空的元素的空实例(例如,空标题或段落),不要使用最

浏览器无法正确识别的原因是什么:

<script src="foobar.js" /> <!-- self-closing script element -->

只有这一点得到承认:

<script src="foobar.js"></script>

这是否打破了XHTML支持的概念


注意:此声明至少对所有IE(6-8 beta 2)都是正确的。

XHTML1规范说明:

给定内容模型不是
空的元素的空实例(例如,空标题或段落),不要使用最小化形式(例如,使用

和不使用

将脚本元素指定为:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>

与XML和XHTML不同,HTML不知道自动关闭语法。将XHTML解释为HTML的浏览器不知道
/
字符表示标记应该是自动关闭的;相反,它们将其解释为空属性,解析器仍然认为标记是“打开的”


正如
被视为
被视为
,Internet Explorer 8及更早版本不支持XHTML解析。即使使用XML声明和/或XHTML doctype,旧IE仍然将文档解析为纯HTML。在纯HTML中,不支持自动关闭语法。后面的斜杠被忽略了,您必须使用一个显式的结束标记


即使是支持XHTML解析的浏览器,例如,也会将文档解析为HTML,除非您为文档提供XML内容类型。但在这种情况下,旧IE将根本不显示文档

为了补充Brad和squadette所说的内容,自动关闭的XML语法实际上是正确的XML,但要使其实际工作,您的web服务器还需要将您的文档作为格式正确的XML发送,并在HTTP内容类型头中使用XML mimetype,如
应用程序/xhtml+XML
(而不是
text/html

但是,发送XML mimetype将导致IE7无法解析您的页面,IE7只喜欢
text/html

发件人:

总之,“应用程序/xhtml+xml” 应用于XHTML系列 文档,以及“text/html”的使用 应限制为与HTML兼容 XHTML1.0文档。“应用程序/xml” 也可以使用“text/xml”,但是 在适当的时候, 应使用“application/xhtml+xml” 而不是那些通用的XML媒体 类型

几个月前我对此感到困惑,唯一可行的(与FF3+和IE7兼容)解决方案是将旧的
语法与
text/html
(html语法+html mimetype)结合使用

如果您的服务器在其HTTP头中发送
文本/html
类型,即使使用格式正确的XHTML文档,FF3+也将使用其html呈现模式,这意味着
将无法工作(这是一个变化,Firefox以前没有那么严格)


无论对
httpequiv
元元素、文档中的XML prolog或doctype进行任何修改,Firefox都会发生这种情况——Firefox在获得
text/html
头后会进行分支,该头确定html或XML解析器是否查看文档内部,而html解析器不理解
InternetExplorer 8及更早版本不支持XHTML的正确MIME类型,
application/XHTML+xml
。如果您将XHTML作为
text/html
提供,这些旧版本的Internet Explorer必须这样做,它将被解释为html 4.01。您只能对任何允许关闭ag省略。参见

XML“short form”被解释为名为/的属性,该属性(因为没有等号)被解释为具有隐含值“/”。这在HTML 4.01中是完全错误的-不允许使用未声明的属性-但浏览器将忽略它


IE9和后来的
应用程序/xhtml+xml

上面的人已经解释了这个问题,但有一点可能会让事情变得清楚,尽管人们在HTML文档中一直使用

等,但任何处于这种位置的
/
基本上都会被忽略,并且只在尝试时使用例如,尝试使用

foo

,你会得到一个规则的段落。

如果有人好奇,最终的原因是HTML最初是SGML的一种方言,这是XML奇怪的老兄弟。在SGML领域,元素可以在DTD中指定为self-closing或self-closing(例如BR、HR、INPUT)、隐式可关闭(例如P、LI、TD)或显式可关闭(例如TABLE、DIV、SCRIPT)

现代浏览器使用的标记汤解析器就是从这一传统演变而来的,尽管它们的解析模型不再是纯粹的SGML。当然,除非您使用XML mime类型发送标记汤,否则精心编制的XHTML将被视为编写糟糕的、受SGML启发的标记汤。这也是为什么

<p><div>hello</div></p>
你好

…被浏览器解释为:

<p></p><div>hello</div><p></p>
你好


…这是一个可爱的模糊错误的配方,当您试图针对DOM编写代码时,它会让您陷入困境。

自动关闭脚本标记无法工作,因为脚本标记可以包含内联代码,HTML不够智能,无法根据属性的存在来打开或关闭该功能

另一方面,HTML确实有一个很好的包含标签 对外部资源的引用:
标记,它可以是 自动关闭。它已经被用于包括样式表、RSS和Atom 订阅源、规范URI和各种各样的东西。为什么不呢 JavaScript

如果您希望脚本标记是自封闭的,您不能像我说的那样这样做,但是有一个替代方法,尽管不是一个聪明的方法。您可以使用自封闭链接标记,并通过给它一个text/JavaScript和rel类型来链接到您的JavaScript
<link type="text/javascript" rel ="script" href="/path/tp/javascript" />