为什么自闭脚本标签不起作用?

dim*_*ist 1284 html javascript xhtml internet-explorer

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

<script src="foobar.js" /> <!-- self-closing script element -->
Run Code Online (Sandbox Code Playgroud)

只有这一点得到承认:

<script src="foobar.js"></script>
Run Code Online (Sandbox Code Playgroud)

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

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

squ*_*tte 463

XHTML 1规范说:

С.3.元素最小化和空元素内容

给定其内容模型不是的元素的空实例EMPTY(例如,空标题或段落)不使用最小化形式(例如,使用<p> </p>而不是使用<p />).

XHTML DTD将脚本标记指定为:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
Run Code Online (Sandbox Code Playgroud)

  • 尽管如此,"不要"与"绝不"是不一样的.这是一个指导原则(兼容性,如章节标题所示),而非规则. (106认同)
  • 实际上,我找不到这个限制的任何用途:)这看起来完全是人为的. (40认同)
  • 它不是规范的标准部分.这是关于如何处理*不支持XHTML*的浏览器的附录 (32认同)
  • 奥拉夫克给出了正确的答案.XHTML 1.0的附录C并不是事物本身的原因 - 它只是如何解决事物的方式. (22认同)
  • `<script />`的问题不在于规范不允许它,但如果内容类型不是application/xhtml + xml,浏览器不会将其解释为"非标签汤".请参阅:http://stackoverflow.com/questions/348736/is-writing-self-closing-tags-for-elements-not-traditionally-empty-bad-practice/348818#348818 @shabunc:浏览器可能*出现*理解它,但实际发生的是它将内容放在<p />*里面*段落之后,由于解释了squadette的引用意味着因为<p>非空,所以它不能自动关闭.在XHTML 1.1中,它*可以*自动关闭. (12认同)

joe*_*rdi 234

为了补充Brad和squadette所说的,自动关闭的XML语法<script />实际上正确的XML,但是为了使它在实践中工作,您的Web服务器还需要将您的文档作为正确形成的XML与XML模仿类型一起发送,例如application/xhtml+xml在HTTP中Content-Type头(和作为text/html).

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

w3:

总之,'application/xhtml + xml'应该用于XHTML Family文档,'text/html'的使用应该仅限于HTML兼容的XHTML 1.0文档.也可以使用'application/xml'和'text/xml',但是在适当的时候,应该使用'application/xhtml + xml'而不是那些通用的XML媒体类型.

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

如果您的服务器text/html在其HTTP标头中发送类型,即使使用其他正确形成的XHTML文档,FF3 +也将使用其HTML呈现模式,这意味着<script />它将无法工作(这是一个更改,Firefox以前不那么严格).

无论是http-equiv在文档中使用元标记,XML序言还是文档类型,都会发生这种情况- 一旦获得text/html标题,Firefox就会分支,这将确定HTML或XML解析器是否在文档内部查看,而HTML解析器无法理解<script />.

  • 因此,简而言之,只有当页面的MIME类型为xhtml/xml时,<script />才有效.对于常规文本/ html页面,它将无法正常工作.如果我们尝试使用"xhtml/xml"MIME类型,它将破坏IE的兼容性.总结一下,Keep Calm and Use <script> ... </ script>感谢Joe ;-) (5认同)
  • 是否正确的结论是,如果您放弃对IE7的支持,发送text/xml将获得对<script />的广泛浏览器支持? (3认同)

gre*_*eim 161

如果有人好奇,最终的原因是HTML最初是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>
Run Code Online (Sandbox Code Playgroud)

...被浏览器解释为:

<p></p><div>hello</div><p></p>
Run Code Online (Sandbox Code Playgroud)

...这是一个可爱的晦涩bug的秘诀,当你尝试对DOM进行编码时,它会让你陷入困境.

  • @AhmedAeonAxan:`P`元素不能包含`DIV`元素(这是无效的HTML),因此浏览器_implicitly_在打开`DIV`标签之前关闭`P`元素(定义为"隐式可关闭").但是,浏览器在这方面往往表现得不同(因为它们可以处理任何无效的HTML). (31认同)
  • HTML5实际上[标准化](https://www.w3.org/TR/2011/WD-html5-20110113/parsing.html)解析“标签汤”,包括一种处理无效标记的一致方法。在那之前,浏览器不得不自己弄清楚如何处理无效的标记,从而导致不一致。当前浏览器中的HTML解析器是有史以来最先进的软件之一。速度飞快,可以处理大多数输入,产生一致的结果。 (7认同)
  • @ColeJohnson不,这不是标签汤; greim正在混淆有效和无效HTML之间的边界.标签汤是当作者不关心规则时得到的,因为浏览器使用纠错.另一方面,缺少`</ p>`结束标记实际上是HTML定义的一部分! (5认同)
  • 我很好奇.为什么浏览器选择以这种方式解释它? (4认同)
  • @MrLister - 排序."标签汤"描述了如何解析HTML,而不是如何编写.这个术语用于描述浏览器用于理解HTML的不同策略,与严格的XML解析形成鲜明对比.XML解析仅允许用于XML mime类型,但由于那些从未得到广泛使用,浏览器会回归到各种"标签汤"方案,即使对于其他有效的文档也是如此. (3认同)

She*_*epy 147

其他人已回答"如何"和引用规范.<script/>经过几个小时的挖掘bug报告和邮件列表,这是"为什么不" 的真实故事.


HTML 4

HTML 4基于SGML.

SGML有一些shorttags,如<BR//,<B>text</>,<B/text/,或<OL<LI>item</LI</OL>.XML采用第一种形式,将结尾重新定义为">"(SGML是灵活的),以便它成为<BR/>.

但是,HTML并没有重新定义,所以<SCRIPT/> 应该意味着 <SCRIPT>>.
(是的,">"应的内容部分,并且所述标签仍然关闭.)

显然,这与XHTML不兼容,并且破坏许多站点(当浏览器足够成熟以至于关心 这一点时),所以没有人实现短标签,并且规范建议不要使用它们.

实际上,所有"工作"的自结束标签都是带有可选结束标签的标签,这些标签位于技术上不符合的解析器上,实际上是无效的.W3C 提出了这个黑客,通过使其与HTML兼容来帮助转换到XHTML .

并且<script>结束标记不是可选的.

"自我结束"标签是HTML 4中的一个黑客,并且毫无意义.


HTML 5

HTML5有五种类型的标签,只允许'void'和'foreign'标签自动关闭.

因为<script>不是无效(它可能有内容)并且不是外来的(如MathML或SVG),<script>所以无论您如何使用它都不能自动关闭.

但为什么?难道他们不能把它视为外国人,特殊情况或其他什么?

HTML 5目的是向后兼容实现它不是基于SGML或XML HTML 4和XHTML 1; 它的语法主要涉及记录和统一实现.(这就是为什么<br/> <hr/>等都是有效的HTML 5虽然是无效的HTML4.)

自闭<script>是实现过去不同的标签之一.它适用于Chrome浏览器,Safari浏览器的工作,和Opera ; 据我所知,它从未在Internet Explorer或Firefox中运行.

这是讨论的时候HTML 5正在起草,并得到了拒绝,因为它打破了 浏览器 的兼容性.自动关闭脚本标记的网页可能无法在旧浏览器中正确呈现(如果有的话).还有其他提案,但它们也无法解决兼容性问题.

草稿发布后,WebKit更新了解析器以使其符合要求.

<script>由于向HTML 4和XHTML 1的向后兼容性,HTML 5中不会发生自动关闭.


XHTML 1/XHTML 5

真正作为XHTML使用时,<script/>真正关闭,正如其他答案所述.

除了规范说,应该在作为HTML服务工作过:

XHTML文档...可能标有Internet媒体类型"text/html"[RFC2854],因为它们与大多数HTML浏览器兼容.

所以发生了什么事?

人们问的Mozilla让火狐解析符合文档作为XHTML不管指定的内容头(被称为内容嗅探).这将允许自动关闭脚本,无论如何内容嗅探是必要的,因为Web主机不够成熟以提供正确的标题; IE很擅长.

如果第一次浏览器战争没有以IE 6结束,那么XHTML也可能已经在列表中.但它确实结束了.IE 6的XHTML 存在问题.其实IE 不支持正确的MIME类型,迫使大家使用text/html,因为IE浏览器的XHTML 了主要的市场份额了整整十年.

而且内容嗅探可能 非常糟糕,人们说它应该停止.

最后,事实证明,在W3C 并不意味着XHTML是sniffable:该文件是两个,HTML和XHTML和Content-Type规则.可以说他们坚持"只要遵循我们的规范"而忽略了实际的东西.一个错误,一直持续到后来的XHTML版本.

无论如何,这个决定解决了 Firefox 的问题.Chrome 出生前已经有7年了; 没有其他重要的浏览器.因此决定了.

由于以下规范,仅指定doctype不会触发XML解析.

  • 非常低估的答案 (5认同)
  • @Dmitry现实情况是,不允许自封闭剧本是一条单行道.作为[链接](http://lists.w3.org/Archives/Public/public-whatwg-archive/2009Aug/0104.html),自闭的<script>将打破*所有*浏览器,用户只会看到空白页面 - 游戏机,互联网电视,*新*企业Win7 PC上的IE 11,数百万[Java运行时](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/web /package-summary.html),或数十亿的智能手机.你能在大多数设备上升级大多数语言的大多数WebView吗?如果HTML5尝试过它们会像XHTML2一样失败. (3认同)
  • @AndyE:你所描述的是向前兼容性 - 旧代码与新编译器/解释器/解析器一起工作的能力.向后兼容性是新代码与旧编译器/解释器/解析器一起使用的能力.所以,是的,向后兼容性是问题,否则用新规范编写的页面在旧浏览器中不起作用(是的,它是Web编程的传统,尝试尽可能地使新代码在旧浏览器中工作). (2认同)
  • 一点点纠正:在HTML中看起来像是自动关闭的标签不是带有_optional_结束标签的标签,而是带有_prohibited_结束标签的标签(空标签或空标签)。带有_optional_结束标记的标记(例如`&lt;p&gt;`或`&lt;li&gt;`)不能被“自封闭”,因为它们_can_具有内容,所以像&lt;p /&gt;这样的代码仅是(格式错误) )开始标签,如果标签后的内容在此元素中允许,它将最终在标签内。 (2认同)

Jac*_*esB 44

Internet Explorer 8及更早版本不支持XHTML解析.即使您使用XML声明和/或XHTML doctype,旧的IE仍然将文档解析为纯HTML.在纯HTML中,不支持自动关闭语法.只是忽略尾部斜杠,您必须使用显式结束标记.

即使支持XHTML解析的浏览器(例如IE 9及更高版本)仍然会将文档解析为HTML,除非您使用XML内容类型提供文档.但在这种情况下,旧的IE将根本不显示文档!

  • "IE不支持XHTML解析." 在编写本文时,IE版本是正确的,但不再是真的. (9认同)
  • @scunliffe IE9是第一个完全支持XHTML的版本.http://blogs.msdn.com/b/ie/archive/2010/11/01/xhtml-in-ie9.aspx?utm_source=feedburner&utm_medium=twitter&utm_campaign=Feed%3A+SiteHome+(Microsoft+%7C+Blog+%7C+ MSDN) (2认同)

Mar*_*ijn 27

上面的人已经解释了这个问题,但有一点可以说清楚的是,尽管人们<br/>/文档中一直使用这样的东西,但是<p/>foo</p>这样的位置基本上都被忽略了,只有在尝试制作某些东西时才会使用既解析的为<br/>/.<p/>foo</p>例如,尝试一下,你会得到一个常规段落.


def*_*u1t 22

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

另一方面,HTML确实有一个很好的标记,用于包含对外部资源的引用:<link>标记,它可以自动关闭.它已经被用于包括样式表,RSS和Atom提要,规范URI以及各种其他好东西.为什么不用JavaScript?

如果你想让脚本标签自我封闭你不能像我说的那样做,但有一个替代方案,虽然不是一个聪明的方法.您可以使用自闭链接标记并通过为其提供一种text/javascript和rel作为脚本链接到您的JavaScript,如下所示:

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
Run Code Online (Sandbox Code Playgroud)

  • @daveL - 我们有`<style>`标签,但是对外部CSS文件使用链接标签.链接标记的定义:_"<link>标记定义文档和外部资源之间的链接."_似乎完全符合逻辑,链接标记将用于外部CSS或JS ......这就是它的用途. .linking在外部文件中.**注意**我不是在谈论规范/跨浏览器/等等,我只是评论使用链接标签引入CSS和JS的逻辑性质......它实际上会有很大意义就是这样.鞋子[比喻]不合适. (8认同)
  • 因为有一个预定义的脚本标签可以完全执行加载脚本的工作.为什么要使用别的东西来混淆问题呢?锤子钉在钉子上..使用鞋子会很聪明吗? (5认同)
  • 我喜欢那样,为什么不"聪明"呢? (4认同)

rpe*_*ich 20

与XML和XHTML不同,HTML不了解自动关闭语法.将XHTML解释为HTML的浏览器不知道该/字符表示该标签应该是自动关闭的; 相反,他们将其解释为空属性,解析器仍然认为标签是"开放的".

正如<script defer>对待<script defer="defer">,<script />被视为<script /="/">.

  • 这个解释很优雅,实际上是错误的.如果是,则DOM中的script元素将有一个"/"属性.我检查过IE,Firefox和Opera,但它们都没有包含这样的属性. (33认同)
  • /不是有效的属性名称字符,因此它被丢弃.否则这个解释很清楚. (11认同)
  • 实际上,一些 HTML 解析器(尤其是验证器)可能会将“/”解释为 NET(空结束标记)结构的一部分。 (2认同)

Mik*_*ick 18

Internet Explorer 8及更早版本不支持XHTML的正确MIME类型application/xhtml+xml.如果您正在text/html为这些旧版本的Internet Explorer 提供XHTML ,那么它将被解释为HTML 4.01.您只能将短语法与允许省略结束标记的任何元素一起使用.请参阅HTML 4.01规范.

XML"简短形式"被解释为名为/的属性,其(因为没有等号)被解释为具有隐含值"/".这在HTML 4.01中是严格错误的 - 不允许使用未声明的属性 - 但浏览器会忽略它.

IE9后来支持XHTML 5与服务application/xhtml+xml.


Bek*_*caj 5

那是因为SCRIPT TAG不是一个VOID ELEMENT.

HTML文档中 - VOID ELEMENTS 根本不需要"结束标记"!

xhtml中,一切都是Generic,因此它们都需要终止,例如"结束标记"; 包括br,一个简单的换行符,<br></br>或者它的简写 <br />.

但是,脚本元素永远不会是void或参数元素,因为脚本标记在其他任何内容之前是浏览器指令,而不是数据描述声明.

原则上,语义终止指令(例如,"结束标签")仅用于处理指令,其语义不能被后续标签终止.例如:

<H1>语义不能被后续语句终止,<P>因为它没有足够的自己的语义来覆盖并因此终止先前的H1指令集.虽然这将能够突破进入一个新的段落行,它不是"足够强大"重写本的字体大小和风格的line-height 倾泻而下的流,即从H1泄漏(因为P没有它).

这就是发明"/"(终止)信令的方式和原因.

一般的无描述终止标签< />就足以满足遇到的级联的任何单一下降,例如:<H1>Title< />但情况并非总是如此,因为我们还希望能够"嵌套",对流进行多次中间标记:拆分在包裹/落入另一个级联之前进入种子.因此,通用终结符例如< />无法确定要终止的属性的目标.例如:<b>粗体 <i>粗斜体 < /> 斜体 </>正常.毫无疑问,我们的意图无法正确,并且很可能将其解释为大胆的粗体大胆的正常.

这就是包装器即容器诞生的概念.(这些概念是如此相似,以至于无法辨别,有时同一个元素可能同时具有两者.同时<H1>是包装器和容器.而<B>只有语义包装器).我们需要一个普通的,没有语义的容器.当然,DIV元素的发明也来了.

DIV元素实际上是2BR-Container.当然,CSS的出现使得整个情况比其他情况更糟糕,并且造成了许多重大后果的巨大混乱 - 间接!

因为使用CSS,您可以轻松覆盖新发明的DIV的原生前后行为,它通常被称为"无所事事的容器".哪个,自然是错的!DIV是块元素,并且在结束信令之前和之后将原生地断开流的线.不久,WEB开始遭受DIV-itis页面的困扰.他们中的大多数仍然是.

CSS的出现使其能够完全覆盖并完全重新定义任何HTML标记的本机行为,以某种方式设法混淆和模糊HTML存在的整个含义......

突然间,所有HTML标签看起来都像是过时的,它们被污损,剥夺了它们原有的意义,身份和目的.不知怎的,你会得到他们不再需要的印象.说:单个容器包装标签足以满足所有数据的呈现.只需添加所需的属性即可.为什么不使用有意义的标签; 随时创建标记名称,让CSS打扰其余部分.

这就是xhtml诞生的方式,当然也是一种直率的,被新来者付出的沉重代价以及对什么是什么的扭曲的看法,以及这一切的目的是什么.W3C从万维网走到了什么错了,同志们?!!

HTML的目的是有意义的数据流式传输给人类接收者.

提供信息.

正式部分仅用于帮助清晰地传递信息.xhtml没有对信息做出丝毫考虑. - 对它而言,信息绝对无关紧要.

在这个问题上最重要的是要知道并且能够理解xhtml不仅仅是某些扩展HTML的版本,xhtml是一个完全不同的野兽; 理由; 因此将它们分开是明智的.