浏览器无法正确识别的原因是什么:
1
< script src= "foobar.js" /> <!-- self- closing script element -->
只有这样才能识别:
1
< script src= "foobar.js" >
这是否打破了XHTML支持的概念?
注意:此声明至少对所有IE(6-8测试版2)都是正确的。
我想你说的是合适的XHTML?一些评论仍在谈论XHTML
在Chrome和Opera工作
另外,请参见以下问题:stackoverflow.com/questions/348736/&hellip;
Chrome的一些最新版本似乎已经打破了这一点,自动关闭的脚本标记在Chrome中不再有效。
它不仅仅是脚本标签。我也不相信自动关闭的DIV标签起作用。
截至2011年7月,Chrome和Firefox出现了这个问题。"这不是一个bug,这是一个特性"-真的很烦人。
XHTML L5自动关闭标签
我只对图像或输入使用自动关闭标记,因为我知道在某些浏览器中可能不支持其余的标记。
两天后,更一般的版本被问到:stackoverflow.com/questions/97522/&hellip;
此外,在某些版本的chrome(至少是mine,目前是34.0.1847.116)中,不仅自动关闭标记中的脚本加载失败,而且可以中断远程文档位置中定义的脚本节点(例如, 中的 s,即使自动关闭的 在 中)。
另请参见:标签的详细分解
XHTML 1规格说明:
3。元素最小化和空元素含量
Given an empty instance of an element whose content model is not EMPTY (for example, an empty title or paragraph) do not use the minimized form (e.g. use
and not
).
xhtml dtd将脚本元素指定为:
1 2
<!-- script statements, which may include CDATA sections -->
<! ELEMENT script ( #PCDATA) >
为了补充Brad和Squadette所说的内容,自动关闭的XML语法 实际上是正确的XML,但要使其在实践中工作,您的Web服务器还需要在HTTP内容类型头(而不是text/html )中使用类似application/xhtml+xml 的XML mimetype将文档作为正确格式的XML发送。
但是,发送一个XML mimetype将导致IE7无法解析您的页面,IE7只喜欢text/html 。
来自W3:
In summary, 'application/xhtml+xml'
SHOULD be used for XHTML Family
documents, and the use of 'text/html'
SHOULD be limited to HTML-compatible
XHTML 1.0 documents. 'application/xml'
and 'text/xml' MAY also be used, but
whenever appropriate,
'application/xhtml+xml' SHOULD be used
rather than those generic XML media
types.
几个月前我对此感到困惑,唯一可行的(与ff3+和ie7兼容)解决方案是将旧的 语法与text/html (html语法+html mimetype)语法结合使用。
如果服务器在其HTTP头中发送text/html 类型,即使XHTML文档格式正确,ff3+也将使用其HTML呈现模式,这意味着 将不起作用(这是一个更改,火狐以前不那么严格)。
这将发生,而不管您是否在修改http-equiv 元元素、文档中的xml prolog或doctype——一旦它得到text/html 头,firefox就会进行分支,以确定html或xml解析器是否在文档中查找,而html解析器不理解 。
如果您放弃对IE7的支持,那么发送文本/XML是否可以获得对的广泛浏览器支持?
因此,简而言之,只有当页面的mime类型是xhtml/xml时才有效。对于普通的文本/HTML页面,它不起作用。如果我们尝试使用"xhtml/xml"mime类型,它将破坏IE兼容性。总结一下,保持冷静并使用……谢谢乔;
很好的解释。另一点值得注意的是,由于类似的原因,火狐也会将本地的.html 文件呈现为标签汤,而不考虑元标签。对于XHTML文件,只有在命名为.xhtml 时,firefox才会相应地呈现它们。
@克里斯莫奇尼。可能,但使用application/xhtml+xml ,而不是text/xml 。
如果有人好奇的话,最终的原因是HTML最初是SGML的一种方言,这是XML奇怪的哥哥。在sgml-land中,元素可以在dtd中指定为自关闭(例如br、hr、input)、隐式可关闭(例如p、li、td)或显式可关闭(例如table、div、script)。XML当然没有这个概念。
现代浏览器使用的标签汤解析器是从这个遗留下来的,尽管它们的解析模型不再是纯粹的SGML。当然,精心设计的XHTML将被视为写得很糟糕的SGML灵感标签汤,除非您使用XML MIME类型发送它。这也是为什么…
…被浏览器解释为:
1 2 3 4 5
< p>
</ p> hello< p>
</ p>
…这是一个可爱的、晦涩难懂的bug的配方,当您试图对DOM进行编码时,它会让您陷入困境。
我很好奇。为什么浏览器选择这样解释它?
@ahmedaeonaxan:P 元素不能包含DIV 元素(这是无效的html),因此浏览器在打开DIV 标记之前隐式关闭P 元素(定义为"隐式可关闭")。但是,浏览器在这方面的行为确实有所不同(因为它们可以处理任何无效的HTML)。
@W3D是我们可以感谢Netscape或IE的标签汤吗?
@不,这不是标签汤;greim在混淆有效和无效HTML之间的边界。当作者不关心规则时,标签汤就是你得到的,因为浏览器使用错误修正。另一方面,缺少的</p> 结束标记实际上是HTML定义的一部分!
@李斯特先生-差不多。tag soup"描述了如何解析HTML,而不是如何编写它。它是一个用来描述浏览器用来理解HTML的不同策略的术语,与严格的XML解析形成鲜明对比。XML解析只允许用于XML mime类型,但是由于这些类型从未得到广泛的使用,所以浏览器退回到各种"标签汤"方案,即使对于其他有效的文档也是如此。
HTML5实际上标准化了对"标签汤"的解析,包括处理无效标记的一致方法。在此之前,浏览器必须自己找出如何处理无效标记,从而导致不一致。当前浏览器中的HTML解析器是有史以来最先进的软件之一。速度极快,可以处理大多数输入,产生一致的结果。
其他人回答了"如何"并引用了规范。这里是"为什么没有 "的真实故事,经过数小时的深入研究bug报告和邮件列表。
HTML 4
HTML 4基于SGML。
SGML有一些短标签,如 、text> 、或
item 。XML采用第一种形式,将结尾重新定义为">"(sgml是灵活的),这样它就变成了 。
然而,HTML并没有变红,所以 应该是> 的意思。(是的,">"应该是内容的一部分,标签仍然没有关闭。)
显然,这与XHTML不兼容,并且会破坏许多站点(到浏览器成熟到可以关心这一点的时候),因此没有人实现短标签,并且规范建议不要使用它们。
实际上,所有"工作"的自结束标记在技术上不一致的解析器上都是带有可选结束标记的标记,实际上是无效的。正是W3C想出了这种方法,通过使XHTML兼容来帮助转换为XHTML。
并且 的结束标签不是可选的。
"self-ending"标签在HTML4中是一种黑客行为,毫无意义。
HTML 5
HTML5有五种类型的标签,只有"void"和"foreign"标签可以自动关闭。
由于 不是无效的(它可能有内容),也不是外来的(如mathml或svg),因此无论您如何使用, 都不能自动关闭。
但是为什么呢?难道他们不能把它看作是外来的、特例的或是什么吗?
HTML5旨在向后兼容HTML4和XHTML 1的实现。它不是基于SGML或XML的;它的语法主要与实现的文档化和统一有关。(这就是为什么
等是有效的html 5,尽管html4无效。)
自关闭 是实现不同的标记之一。它曾经在Chrome、Safari和Opera中工作;据我所知,它从未在Internet Explorer或Firefox中工作过。
这是在起草HTML 5时讨论的,因为它破坏了浏览器兼容性而被拒绝。在旧浏览器中,自关闭脚本标记的网页可能无法正确呈现(如果有的话)。还有其他的建议,但它们也不能解决兼容性问题。
草案发布后,WebKit更新了解析器以使其符合要求。
由于与HTML 4和XHTML 1的向后兼容性,HTML 5中不会出现自动关闭 。
XHTML 1/XHTML 5
当真正作为XHTML使用时, 实际上是关闭的,正如其他答案所述。
除了规范规定当它作为HTML使用时应该有效:
XHTML Documents ... may be labeled with the Internet Media Type"text/html" [RFC2854], as they are compatible with most HTML browsers.
那么,发生了什么?
人们要求Mozilla允许Firefox将符合要求的文档解析为XHTML,而不管指定的内容头(称为内容嗅探)。这将允许自动关闭脚本,而且无论如何,内容嗅探是必要的,因为Web主机还不够成熟,无法提供正确的头文件;即,它非常擅长。
如果第一次浏览器大战不是以IE6结束的话,XHTML可能也在名单上。但它确实结束了。IE6和XHTML有问题。事实上,IE根本不支持正确的mime类型,这迫使每个人都使用text/html 作为xhtml,因为IE在整个十年中占据了主要的市场份额。
此外,内容嗅探可能非常糟糕,人们说应该停止。
最后,结果发现W3C并不意味着XHTML是可嗅探的:文档是HTML和XHTML,以及Content-Type 规则。可以说,他们是坚定地站在"只要遵循我们的规范"和忽视什么是实际的。这一错误一直延续到后来的XHTML版本中。
不管怎样,这个决定解决了火狐的问题。Chrome诞生前7年,没有其他重要的浏览器。于是决定了。
由于以下规范,仅指定doctype不会触发XML分析。
"由于向后兼容性,HTML 5中不会出现自动关闭 "—这并不是真的,因为向后兼容性的任何方面都不会被破坏,也就是说,已经编写的代码仍然可以在支持自动关闭 的较新浏览器中继续工作。真正的原因是 将是唯一的自动结束标记,因为HTML没有定义任何其他标记。此外,只有外部标签可以自动关闭,因为无效标签没有结束标签。请参见开始标记,步骤6。
@当你写自动关闭时,当时的主要浏览器并不认为它是关闭的,并且会将后续的HTML解析为javascript,导致有效的HTML5在这些旧浏览器上中断。因此,该提案被拒绝。这在链接的HTML5邮件列表中进行了解释。
由于讨论很突然结束,该提案被拒绝的主要原因尚不清楚,尽管用新代码破坏现有浏览器是引发的问题之一。我只是指出,作为允许自动关闭的HTML5元素, 将是唯一的。我在第一条评论中的意思是向后兼容性不会受到损害,因为向后兼容性指的是在较新浏览器中运行的旧代码——在本例中这是很好的。
@andye:您所描述的是向前兼容性——旧代码与新编译器/解释器/解析器协同工作的能力。向后兼容性是新代码使用旧编译器/解释器/解析器的能力。所以是的,向后兼容性是问题所在,否则用新规范编写的页面在旧浏览器中就不起作用了(是的,Web编程的传统是尽量让新代码在旧浏览器中工作)。
异端邪说!链接rel不需要自动关闭和自动关闭就可以工作,但脚本不能工作。这是更改一行doctype的问题。此外,我作为一个意见无关紧要的人,声明XHTML doctypes已过时,因为HTML5标记不能验证为有效的XHTML。XHTML仍然是一个很棒的工具,它允许您在HTML页面中创建自定义实体,允许您使用实体而不是完整链接URL,以及实体而不是可能更改的内容,例如名称。但是没有理由为此使用XHTML doctype,它已经过时,而且从未更新过。为什么这仍然是一个问题!
@Dmitry的现实是,不允许自封脚本是一条单行道。作为链接,自关闭将打破所有浏览器,用户将只看到空白的网页游戏控制台,互联网电视,新的公司WI7 PC上的IE 11,数百万的Java运行时,或数十亿的智能手机。您能在大多数设备上升级大多数语言的大多数WebView吗?如果HTML5尝试过,它们会像XHTML 2一样失败。
@Sheepy开始一个折旧期,并将其与"主要兼容性更新"捆绑在一起,这将是一个开始。或者,这只能对XHTML网页产生影响,这样格式良好的网页可以同时显示这两种网页,而传统的HTML只能接受它现在接受的内容。虽然XHTML在许多方面都失败了,但它仍然可以推动改进为那些不依赖于一种而且只有一种写入方式的设备编写网页。没有它,HTML就变成了一个程序集,一个很重的程序集。-继续-
@SheepyHTML主要被看作是Web的一个组件,因为直接在其中编写是混乱的,并且很难维护。它也可以替换为原始二进制格式,以节省更多的空间。XHTML利用了这些问题中的大部分,使用模式、可扩展实体等,从而允许以可维护的方式编写HTML。相反,我看到的大多数站点基本上都是生成的,而那些不需要像这样与传统的gotchas作斗争的站点,并且在不使代码看起来杂乱无章的情况下,很难让源代码保持每行80个字符的限制。
@dmitry这个问题的重点是为什么,可能不是一个适当的地方来讨论这个gotcha是否使HTML5过时,您的梦想是为HTML而使用WASM,或者为什么我们应该/不应该将我们的代码限制为80个字符(我不这样做;我开发这些HTML"生成器"作为我的工作)。
@谢皮,对不起,我不是故意要说这些话。我不认为HTML5已经过时了;我不梦想WASM,我只是在提到编写漂亮的手工HTML时遇到的困难;我对HTML的生成非常感兴趣。你说得对,这不是一个如何克服HTML中不一致性的主题,它们可能根深蒂固,无法通过单独更改标准来解决。
答案很低
一点更正:在HTML中看起来像是自关闭的标记不是带有可选结束标记的标记,而是带有禁止结束标记的标记(空的或无效的标记)。带有可选结束标记(如
或
的标记)不能"自关闭",因为它们可以有内容,所以像
这样的代码只不过是一个(格式错误的)开始标记,如果在该元素中允许,其后的内容将结束在它内部。
Internet Explorer 8及更早版本不支持XHTML分析。即使使用XML声明和/或XHTML doctype,旧的IE仍然将文档解析为纯HTML。在纯HTML中,不支持自动关闭语法。尾随斜杠被忽略,必须使用显式结束标记。
即使支持XHTML解析的浏览器(如IE9和更高版本)也将以HTML形式解析文档,除非您为文档提供XML内容类型。但在这种情况下,旧的IE根本不会显示文档!
"IE不支持XHTML解析。"在编写时对于IE版本是正确的,但不再是正确的。
@爱立信你能解释一下哪一个版本的IE修正了这个吗?(以及任何特定条件-例如需要有效的doctype)
@scunliffe ie9是第一个完全支持xhtml的版本。blogs.msdn.com/b/ie/archive/2010/11/01/&hellip;
上面的人已经很好地解释了这个问题,但是有一件事可能会使事情变得清楚,尽管人们在HTML文档中一直使用 和类似的东西,但是在这种位置上的任何/ 基本上都被忽略了,并且只在试图使XML和HTML都可以解析时使用。例如,试试
foo
,你就会得到一个常规段落。
自关闭脚本标记将不起作用,因为脚本标记可以包含内联代码,并且HTML不够智能,无法基于属性的存在打开或关闭该功能。
On the other hand, HTML does have an excellent tag for including
references to outside resources: the tag, and it can be
self-closing. It's already used to include stylesheets, RSS and Atom
feeds, canonical URIs, and all sorts of other goodies. Why not
JavaScript?
如果您希望脚本标记是自封闭的,那么您不能像我所说的那样做,但是还有一个选择,尽管不是一个聪明的选择。您可以使用自动关闭的链接标记,并通过将文本/javascript和rel类型作为脚本链接到您的javascript,如下所示:
1
< link type= "text/javascript" rel = "script" href= "/path/tp/javascript" />
我喜欢这样,为什么不"聪明"?
因为有一个预定义的脚本标记可以精确地执行加载脚本的任务。你为什么用别的东西把事情搞混了?锤子在钉子里锤打。穿鞋子会明智吗?
@davel-我们有
标记,但是对外部CSS文件使用链接标记。链接标记的定义:" 标记定义了文档和外部资源之间的链接。"链接标记将用于外部CSS或JS似乎完全合乎逻辑……这就是它用于外部文件中的链接。注意,我不是在说spec/cross browserness/etc,我只是在评论使用链接标签引入CSS和JS的逻辑性质……如果是这样的话,它实际上会很有意义。不确定鞋[类比]是否合适。
与XML和XHTML不同,HTML不了解自动关闭语法。将XHTML解释为HTML的浏览器不知道/ 字符表示标记应该是自动关闭的;相反,它们将其解释为空属性,解析器仍然认为标记是"打开的"。
正如 被视为 , 被视为 。
虽然这个解释很优雅,但实际上是错误的。如果它是真的,那么DOM中的脚本元素将有一个"/"属性。我检查过IE、火狐和Opera,它们都没有包含这样的属性。
/不是有效的属性名字符,因此它被丢弃。否则,这个解释就相当清楚了。
实际上,一些HTML解析器(尤其是验证器)可能会将/ 解释为net(空结束标记)构造的一部分。
Internet Explorer 8及更高版本不支持XHTML、application/xhtml+xml 的正确MIME类型。如果您将XHTML作为text/html 提供,而这些旧版本的Internet Explorer必须这样做,那么它将被解释为HTML 4.01。您只能对允许省略结束标记的任何元素使用短语法。请参见HTML 4.01规范。
XML"short form"被解释为名为/的属性,该属性(因为没有等号)被解释为隐式值为"/"。这在HTML4.01中是完全错误的-不允许使用未声明的属性-但是浏览器会忽略它。
IE9和后来的支持XHTML 5与application/xhtml+xml 一起使用。
IE9支持XHTML,IE不再大于51%。你能更新你的答案吗?
这是因为脚本标记不是空元素。
在HTML文档中-void元素根本不需要"结束标记"!好的。
在XHTML中,所有内容都是通用的,因此它们都需要终止,例如"结束标记";包括br,一个简单的换行符,如 或其速记 。好的。
但是,脚本元素绝不是空元素或参数元素,因为脚本标记在其他元素之前是浏览器指令,而不是数据描述声明。好的。
原则上,语义终止指令(例如,"结束标记")仅用于处理语义不能由后续标记终止的指令。例如:好的。
语义不能由后面的
终止,因为它本身的语义不足以覆盖并因此终止前面的h1指令集。虽然它能够将流分解为新的段落行,但它"不够强大"无法覆盖当前字体大小和样式行高度,即从h1泄漏(因为p没有它)。好的。
这就是"终止"信号的发明方式和原因。好的。
像< /> 这样的通用无描述终止标签可以满足遇到的级联的任何单个下降,例如:Title< /> ,但情况并非总是这样,因为我们还希望能够"嵌套",流的多个中间标记:在包装/下降到另一个级联之前拆分成流。因此,像< /> 这样的通用终结器将无法确定要终止的属性的目标。例如: 粗体 粗体< /> 斜体> 正常。毫无疑问,我们的意图是不正确的,最可能解释为大胆大胆的意大利大胆的正常。好的。
包装器的概念就是这样诞生的,容器。(这些概念如此相似,以至于无法辨别,有时相同的元素可能两者都有。 同时是包装物和容器。而 只是一个语义包装器)。我们需要一个简单的、没有语义的容器。当然,一个DIV元素的发明是由它引起的。好的。
DIV元素实际上是一个2BR容器。当然,CSS的出现使整个情况比原本的情况更为奇怪,并导致了巨大的混乱,并产生了许多巨大的后果——间接的!好的。
因为有了CSS,您可以很容易地覆盖一个新发明的DIV的本机pre&after-br行为,它通常被称为"不做任何事情的容器"。这当然是错误的!div是块元素,在结束信号发送之前和之后都会本地中断流的行。很快,网络就开始遭受页面分割的痛苦。他们中的大多数仍然是。好的。
CSS的出现及其完全重写和重新定义任何HTML标记的本机行为的能力,以某种方式设法混淆和模糊了HTML存在的全部意义…好的。
突然间,所有的HTML标签都显得过时了,它们被破坏了,失去了所有的原始含义、身份和目的。不知怎么的,你会觉得他们不再需要了。说:一个容器包装标签就足以满足所有的数据表示。只需添加所需的属性。为什么不换个有意义的标签呢;边走边发明标签名,让CSS来处理其余的问题。好的。
XHTML就是这样诞生的,当然,它的直率是由新来者付出了高昂的代价,它扭曲了人们对什么是什么,以及它的目的到底是什么的看法。W3C从万维网走向了哪里,同志们?!!!好的。
HTML的目的是将有意义的数据流传送给人类接收者。好的。
传递信息。好的。
正式部分仅用于帮助信息传递的清晰性。XHTML对这些信息没有丝毫的考虑。-对它来说,这些信息是完全不相关的。好的。
最重要的是要知道并能够理解XHTML不仅仅是一些扩展的HTML的版本,XHTML是一种完全不同的野兽,它会搁浅,因此最好将它们分开。好的。好啊。
区别是"真实XHTML"、"虚拟XHTML"和HTML,以及服务器的重要性-sent mime type had already described here well.如果你现在想尝试它,这里是简单编辑的Snippet与现场预览,包括自闭的脚本标记,可以浏览器:
1 2
div { display: flex; }
div + div { flex- direction: column; }
ZZU1
你应该看到下面的文本框。
对于无法浏览器,您可以复制文本区域的内容,并将其保存为一个文件。