自关闭脚本元素为什么不起做用?

浏览器没法正确识别的缘由是什么: javascript

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

只有这是公认的: css

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

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

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


#1楼

自闭脚本标签将没法工做,由于脚本标签能够包含内联代码,而且HTML不够灵巧,没法根据属性的存在打开或关闭该功能。 java

另外一方面,HTML确实具备出色的标记,能够包含对外部资源的引用: <link>标记,它能够是自动关闭的。 它已经包括样式表,RSS和Atom提要,规范URI以及各类其余功能。 为何不使用JavaScript? node

若是您但愿脚本标签是自封闭的,则不能像我所说的那样进行,可是有一种替代方法,尽管不是明智的选择。 您可使用自行关闭连接标记,并经过将其指定为文本/ JavaScript和rel做为脚本的类型来连接至JavaScript,以下所示: web

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />

#2楼

其余人回答了“如何”并引用了规范。 通过数小时的研究,他们找到了错误报告和邮件列表,这是“为何没有<script/> ”的真实故事。 windows


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 提出了此hack ,以经过使其与HTML兼容来帮助过渡到XHTML。

而且<script>的end标签不是禁止的

“ Self-end”标记是HTML 4中的一种hack,没有意义。


HTML 5

HTML5具备五种类型的标记,而且仅容许“ void”和“ foreign”标记为自动关闭

由于<script>不是无效的( 可能有内容)而且不是外来的(例如MathML或SVG),因此不管如何使用, <script>都不能自封闭。

但为何? 他们难道不能认为它是外国的,特例或其余东西吗?

HTML 5旨在与HTML 4和XHTML 1的实现 向后兼容 。它不基于SGML或XML;它不基于SGML或XML。 它的语法主要涉及文档化和实现统一。 (这就是为何<br/> <hr/>等尽管是无效的HTML4也有效的HTML 5的缘由 。)

自闭合<script>是实现方式不一样的标记之一。 它曾经在Chrome,Safari 和Opera中运行 ; 据我所知,它历来没有在Internet Explorer或Firefox中起做用。

在起草HTML 5并遭到拒绝时,讨论了该问题 ,由于它破坏了 浏览器的 兼容性 。 具备自关闭脚本标记的网页在旧浏览器中可能没法正确呈现(若是有的话)。 还有其余建议 ,但它们也不能解决兼容性问题。

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

因为与HTML 4和XHTML 1的向后兼容性,在HTML 5中不会发生自闭合<script>


XHTML 1 / XHTML 5

其余答案所述,当真正用做XHTML时, <script/>确实是封闭的。

除了规范说它在用做HTML时应该已经起做用:

XHTML文档...能够标记为Internet媒体类型“ text / html” [RFC2854],由于它们与大多数HTML浏览器兼容。

因此发生了什么事?

人们要求Mozilla 容许Firefox将符合条件的文档解析XHTML,而无论指定的内容标头(称为Content Sniffing )如何。 这将容许自动关闭脚本,而且不管如何都必须进行内容嗅探,由于Web托管者还不够成熟,没法提供正确的标头。 IE很擅长

若是第一次浏览器之战没有以IE 6结束,那么XHTML可能也已列入清单。 但它确实结束了。 IE 6的XHTML 有问题 。 实际上,IE 根本不支持正确的MIME类型,这迫使每一个人都text/html用于XHTML,由于IE 占据了整整十年的主要市场份额

并且内容嗅探可能 真的很糟 ,人们表示应该中止嗅探。

最终,事实证实W3C 并不意味着XHTML是可嗅探的 :该文档既是 HTML和XHTML,又是Content-Type规则。 能够说他们坚决地坚持“只是遵循咱们的规范”,而忽略了实际的作法 。 这个错误一直持续到后来的XHTML版本。

不管如何,这个决定解决了 Firefox 的问题 。 Chrome 诞生已有7年了; 没有其余重要的浏览器。 这样就决定了。

因为遵循如下规范,仅指定doctype不会触发XML解析。


#3楼

万一有人好奇,最终的缘由是HTML最初是SGML的方言,SGML是XML的怪异哥哥。 在SGML域中,能够在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>

...这是一个可爱的,难以理解的错误的秘诀,当您尝试对DOM进行编码时,可能会使您陷入困境。


#4楼

那是由于SCRIPT TAG不是无效元素。

HTML文档中 -VOID ELEMENTS 根本不须要“结束标记”!

xhtml中 ,全部内容都是通用的,所以都须要终止,例如“结束标记”; 包括br,一个简单的换行符,如<br></br>或它的速记 <br />

可是,脚本元素决不能是void或参数化元素,由于在其余任何内容以前, 脚本标签都是浏览器指令,而不是数据描述声明。

原则上,仅当处理语义不能被后续标签终止的指令时,才须要“语义终止指令”,例如“关闭标签”。 例如:

<H1>语义不能由后面的<P>终止,由于它没有足够的自身语义来覆盖并所以终止先前的H1指令集。 尽管它可以将分红新的段落行,可是它不足以覆盖当前的字体大小和样式行高,使之流中倾泻而下 ,即从H1泄漏(由于P没有) )。

这就是发明“ /”(终止)信号的方式和缘由。

通用的无描述终止标记(如< />足以知足所遇到的级联的任何单个降低,例如: <H1>Title< />但并不是老是如此,由于咱们还但愿可以“嵌套” ”,Stream的多个中间标记:在包装/掉落到另外一个级联以前分红种子。 结果,诸如< />类的通用终止符将没法肯定要终止的属性的目标。 例如: <b> 粗体 <i> 粗体斜体 < /> 斜体 </>正常。 无疑将没法正确理解咱们的意图,而且极可能会将其解释为粗体, 粗体,斜体,粗体

这就是包装器(即容器) 这一律念的诞生。 (这些概念是如此类似,以致于没法辨别,有时同一元素可能同时具备。 <H1>是包装器和容器。而<B>只是语义包装器)。 咱们须要一个没有语义的普通容器。 固然,DIV元素的发明也随之而来。

DIV元素其实是2BR容器。 固然,CSS的出现使整个状况变得比之前更怪异,并形成了许多巨大后果的混乱-间接地!

由于使用CSS能够轻松地覆盖新发明的DIV的本地BR先后行为,因此一般将其称为“不执行任何操做的容器”。 这是天然的错误! DIV是块元素,将在结束信号发送以前和以后天然中断流的行。 不久,WEB开始遭受页面DIV感染。 他们大多数仍是。

CSS的到来,它具备彻底覆盖和彻底从新定义任何HTML Tag的本机行为的能力,从而以某种方式设法混淆和模糊了HTML存在的所有含义...

忽然,全部HTML标记彷佛都已过期,它们被污损了,剥夺了全部原始含义,身份和用途。 您会以某种方式得到再也不须要它们的印象。 说:一个容器包装标签就足够了全部数据表示。 只需添加所需的属性。 为何没有有意义的标签呢? 随便发明标签名称,而后让CSS其他的地方都麻烦。

这就是xhtml的诞生方式,固然是巨大的挫折,它是由新来者付出了如此高昂的代价,而且对什么是什么以及这一切的目的是什么产生了错误的认识。 W3C从万维网发展到哪里错了,同志们!

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

传递信息。

正式的部分只是为了帮助信息传递的清晰。 xhtml对此信息没有丝毫考虑。 -对此,信息绝对可有可无。

这件事中最重要的事情是要知道并可以理解xhtml不只仅是某些扩展HTML的版本 ,xhtml是彻底不一样的野兽; 地面 所以, 最好将它们分开。


#5楼

这里已经很好地描述了 “真正的XHTML”,“伪XHTML”和HTML之间的区别以及服务器发送的MIME类型的重要性。 若是您想当即尝试,这里是带有实时预览的简单可编辑代码段,其中包括适用于功能强大的浏览器的自封闭脚本标签:

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>

您应该看到Hello, true XHTML. Nice to meet you! Hello, true XHTML. Nice to meet you! 在文本区域下方。

对于没法使用的浏览器,您能够复制文本区域的内容并将其另存为扩展名为.xhtml (或.xht )的文件( 感谢Alek的提示 )。

相关文章
相关标签/搜索