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规范说:
给定其内容模型不是的元素的空实例
EMPTY
(例如,空标题或段落)不使用最小化形式(例如,使用<p> </p>
而不是使用<p />
).
XHTML DTD将脚本标记指定为:
<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
Run Code Online (Sandbox Code Playgroud)
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 />
.
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进行编码时,它会让你陷入困境.
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解析.
Jac*_*esB 44
Internet Explorer 8及更早版本不支持XHTML解析.即使您使用XML声明和/或XHTML doctype,旧的IE仍然将文档解析为纯HTML.在纯HTML中,不支持自动关闭语法.只是忽略尾部斜杠,您必须使用显式结束标记.
即使支持XHTML解析的浏览器(例如IE 9及更高版本)仍然会将文档解析为HTML,除非您使用XML内容类型提供文档.但在这种情况下,旧的IE将根本不显示文档!
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)
rpe*_*ich 20
与XML和XHTML不同,HTML不了解自动关闭语法.将XHTML解释为HTML的浏览器不知道该/
字符表示该标签应该是自动关闭的; 相反,他们将其解释为空属性,解析器仍然认为标签是"开放的".
正如<script defer>
对待<script defer="defer">
,<script />
被视为<script /="/">
.
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
.
在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是一个完全不同的野兽; 理由; 因此将它们分开是明智的.
归档时间: |
|
查看次数: |
122853 次 |
最近记录: |