自关闭脚本元素为何不起作用?

我只是一个虾纸丫 提交于 2019-12-09 19:21:38

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

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

只有这是公认的:

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

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

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


#1楼

自闭脚本标签将无法工作,因为脚本标签可以包含内联代码,并且HTML不够灵巧,无法根据属性的存在打开或关闭该功能。

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

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

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

#2楼

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


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的提示 )。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!