找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1652|回复: 0

[分享] HTML和XHTML的不同

[复制链接]
发表于 2013-3-27 15:02:19 | 显示全部楼层 |阅读模式 来自 中国–广东–湛江
请注意以下信息是基于(X)HTML5的当前规范,某些技术上问题并不适用于HTML的早先版本。
  虽然HTML和XHTML看起来在语法上类似,但在很多方面显著的不同。
注:由于当前的WHATWG[2]文档是一个草案,这个部分需要跟随一个变化的对象。标记@@@的不同是从理论上可以被改变且不影响向后兼容的不同。
  MIME类型(MIME Types)

  • XHTML必须以XML MIME类型来提供,例如application/xml 或 application/xhtml+xml。
  • HTML必须以text/html来提供。



  MIME类型决定了使用文件的类型。如果尝试使用text/html来发送XHTML,你实际上仅使用了HTML,可能有语法错误。
技术上,依据规范,XHTML1.0被允许作为text/html来发送。但是正是由于上面的原因,这样的一个文件被认为是HTML文件而不是XHTML文件
  解析(Parsing)

  XHTML用XML解析请求。HTML用它自己定义的更接近当前浏览器实际处理HTML的方式。


  • 在XHTML中,良构性(well-formedness)错误是致命的。在HTML中,错误处理规则更加优雅。良构性错误在HTML也是语法错误,包括以下:

    • 未编码的和符号(&替代&amp;)和小于符号(<替代&lt;)(这并不应用于CDATA)。(注:在HTML中,未编码的和符号在一些情况下是被允许的。)
    • 注释包含额外的连接字符或以一个连接字符结尾。例如:<!--语法--错误--> or <!--语法错误--->
    • 不匹配结束标签。(不适用于可选标签元素)
    • 不闭合标签。
    • 非法字符出现在属性名称前或中。
    • 文件结束(EOF)意外发生。
    • 非法的字符出现在DOCTYPE名前。
    • 丢失DOCTYPE名。
    • 在DOCTYPE中PUBLIC标识符没有SYSTEM标识符。(注:在HTML5中包含这些中的任何一个是语法错误,在XML中允许唯一的SYSTEM标识符出现在它自己中。)
    • 有属性的结束标签。
    • 非法结束标签。(在HTML中,一个非法的</br>和</p>会导致产生隐含在它之前的开始标签。)



  • 内部子集在XML中是允许的,在HTML中是无意义的(且被禁止)

    • 在一些情况下,HTML中的内部子集最终部分内联呈现。
  • 当符号序列"]]>"在内容中不标记一个CDATA段的结束时,在XHTML中是一个良构性错误,但在HTML中是有效的。
  • <![CDATA[...]]>,在XHTML中是一个CDATA片段,在HTML中是一个伪造的注释。
  • <?foo &hellip;?>,在XHTML中是一个处理指令,在HTML中是一个伪造的注释。
  • 在HTML中,用于空元素语法的尾部斜线在非空(non-void)元素(见下)中会有解析错误,但在所有情况下都被忽略。
  • 在HTML中,script和style元素作为CDATA解析。(注:这个CDATA的定义不同于XML中的。)在XML中,它们作为普通元素解析(这意味着注释被当着真正的注释,看起来像起始标签的就是起始标签)。
  • 在HTML中,title和textarea元素作为RCDATA被解析。(RCDATA定义不同于SGML中的,也不是XML的RCDATA.)
  • 在HTML中,如果脚本执行(scripting)是可用,noscript元素作为CDATA被解析。如果脚本执行是不可用的,它作为PCDATA被解析。在XHTML中,这个元素是没有作用的,当脚本执行不可用时,不能真正被用于阻止内容将要呈现。
  • 在HTML中,iframe,noembed和noframes作为CDATA解析。在XHTML中作为普通元素被解析,因此不能阻止内容被使用。
  • 在XHTML中属性值的空格(white space)符被标准化为空白[3]。
  • 在HTML中,可选标签的元素在特定情况下被隐藏。
  • 在HTML中,在body中出现的带标签的title元素被转移到head中。在XHTML中,它停在指定它的地方。
  • 在HTML中,脱离上下文(context)出现的特定元素的标签被忽略。包括:caption,col,colgroup,frame, frameset,head,option,optgroup,tbody,td,tfoot,th,thead,tr。
  • plaintext在HTML中有一个特别的解析请求。(无论如何,它都是被禁止的。)
  • 这并不是全部的在HTML中发生的边界状态和错误条件。



  语法(Syntax)



  • 在HTML中,doctype是必须的。在XHTML中是可选的。
  • 在XHTML中,标签名和属性名是大小写敏感的。在HTML中,它们是不敏感的。
  • 在XHTML中,非空元素必须有一个开始标签和一个结束标签。在HTML中,某些元素允许省略一个或两个标签。

    • html (两个)
    • head (两个)
    • body(两个)
    • li (结束标签)
    • dt (结束标签)
    • dd (结束标签)
    • p (结束标签)
    • colgroup (两个)
    • thead (结束标签)
    • tbody(两个)
    • tfoot (结束标签)
    • tr (结束标签)
    • td (结束标签)
    • th (结束标签)
  • 在XHTML中,空元素可以用空元素语法(<br />)或一个结束标签紧跟在开始标签的后面(<br>&lt/br>)。在HTML中,空元素(empty elements)语法(尾部斜线)允许出现在空元素(void elements)上[4],但是禁止在非空元素上。无论如何,它没有任何意义可言,可以省略。对于空元素,结束标签是禁止的。

    • base, link, meta, hr, br, img, embed, param, area, col 和 input。
    • 注:在解析请求时,下面的元素被当作空元素对待,因为它们是过时和不标准的。尾部斜线是不允许的:basefont, bgsound, spacer,wbr(在任何方式下这些元素都是不允许的,所以它们没有太多不同)。
  • HTML允许属性最简化(minimisation),比如省略这个值,而XHTML不允许。
  • HTML允许使用没有引号的属性值,而XHTML不允许。
  • XHTML允许使用CDATA片段,而HTML不允许。
  • XHTML允许处理指令,而HTML不允许。
  • 在HTML中,所有实体引用(entity references)都是预定义的,不请求一个文档类型定义(DTD[5])。但是由于XHTML5没有DTD,实体引用不能用在XHTML中(包括5中预定义的实体:&ampamp;,&amplt;,&ampgt;,&ampquot; 和&ampapos;)。

    • 可以用自己的验证解释器提供自己的DTD,但是浏览器不能使用这个验证解析器而将无法读取DTD。
  • 一套合法的unicode字符集在XML1.0中的限制远超在HTML中。
  • XHTML允许命名空间前缀,但是HTML禁止。



  标记(Markup)



  • 在XHTML中,命名空间声明(xmlns属性)是必须的。在HTML中的html元素也允许xmlns属性出现,其值是"http://www.w3.org/1999/xhtml"。

    • <html xmlns="http://www.w3.org/1999/xhtml">
    • 在HTML中,xmlns没有绝对作用。它基本上是一个护身符。它被允许仅仅是为了从XHTML移植过来更容易。当被HTML解析器解析时,这个属性最终处于无效的(null)命名空间中。
    • 在XML(和XML命名空间理解的解析器)中,xmlns属性是其命名空间声明机制的一部分,一个元素实际上在无效的命名空间中是不能有xmlns属性的。当DOM执行时,这个属性最终在"http://www.w3.org/2000/xmlns/"命名空间中。
  • XHTML允许使用非XHTML元素和属性(在不同的命名空间),HTML不允许。
  • XHTML用xml:lang属性,HTML用lang属性代替。
  • XML ID引入xml:id,能用在XHTML中,但在HTML中没有作用。
  • 在HTML中,noscript能被使用,在XHTML中,它是禁止的。
  • HTML用base元素,XHTML用xml:base代替。
  • 在XHTML中,p元素也许包含结构化的内联级(inline level)元素,包括blockquote, dl, menu, ol, ul, pre 和 table。在HTML序列化中,由于向后兼容的限制,这是不可能的(虽然它或许可以通过DOM操作实现)。
  • 在XHTML中,table元素或许包含子tr元素。在HTML序列化中,由于向后兼容的限制,这是不可能的(虽然它或许可以通过DOM操作实现)。



  字符编码(Character Encoding)



  • 在XHTML中,XML声明被用于指定的字符编码。在HTML中,禁止XML声明。
  • 在HTML中,带有一个charset属性的meta可以用于代替。在XHTML中,如果有包含它,它是被禁止且忽略的。
  • XHMTL的默认编码是依据XML规则,UTF-8或UTF-16。在HTML中如果没有声明编码,它应该决定执行一个特别的启发式的或退回到一个默认的值。(规范中本章节还未完成)



  脚本(Scripts)



  • document.write()和document.writeln()不能用在XHTML中,但能用在HTML中。
  • 在XHTML中,通过innerHTML属性获取的字符串必须是一个良构的XML片段。
  • DOM APIs在XHTML中是大小写敏感的,但是一些在HTML中是不敏感的。(不适用于那些不在HTML命名空间的元素。)

    • Element.tagName, Node.nodeName,和 Node.localName 返回是大写的值。
    • Document.createElement()是大小写不敏感的(规范写法是小写)。
    • Element.setAttributeNode()将会把属性名改成小写。
    • Element.setAttribute()是大小写不敏感的(规范写法是小写)。
    • Document.getElementsByTagName()和 Element.getElementsByTagName()是大小写不敏感的。
    • Document.renameNode()。如果新的命名空间是HTML命名空间,在重命名执行之前新的合格的名字必须是小写。
  • 在HTML中,Document.createElement()在HTML命名空间下创建一个元素。在XML(包括XHTML),这个被DOM2和DOM3定义的命名空间是空的。


  • 在XHTML中,浏览器在这个领域缺乏通用性。在Firefox,这个命名空间依赖于MIME类型。在Opera它依赖于根元素,而在Safari,它一直是无效的。



  样式表(Stylesheets)



  • 用于CSS中的选择器(selectors)匹配在XHTML中是大小写敏感的,在HTML中大小写不敏感的。
  • 在HTML中在画布上渲染背景,CSS请求body元素的特殊处理,但不适用于XHTML。

评分

参与人数 1金币 +10 收起 理由
猫性男孩 + 10 神马都是浮云

查看全部评分

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-12-22 21:17 , Processed in 0.056728 second(s), 13 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表