正确使用XHTML的冒险
日期:2007年9月19日 作者: 查看:[大字体 中字体 小字体]-
原文:http://www.456bereastreet.com/archive/200501/the_perils_of_using_xhtml_properly/
作者:Roger Johansson
翻译:Neo (http://www.omemo.net/neo)
修正:JunChenJunChen注:omemo.net网站似乎已经挂掉,链接都失效了。文章写得非常不错,一直是Best of 456 Berea Street。在这里发布的时候我进行了少量代码上和翻译上的修改,以忠实原著。
我使用XHTML有些年了,但直至去年夏天我才着眼于如何正确使用,那就是说,以
application/xhtml+xml的MIME类型来伺服(server)它。虽然我遇到了这些问题,但我知道问题远非如此。就如你即将发现的一样,当你开始使用真正的XHTML,你会遭遇很多似乎细小但让人困惑的问题。请注意这不是一篇讨论支持或反对使用XHTML的文章。我只是写下我所知道的潜在的易犯错误,并且让你自己来决定自己的选择:HTML 4.01,为所有浏览器伺服为
text/html的XHTML 1.0或者为能够处理其的浏览器伺服为application/xhtml+xml而其他浏览器则伺服为text/html的XHTML 1.0。否则有些东西会完全不一样。只有在问题发生的时候,我才有机会去了解和认识这些东西。有些情况下我必须花很多时间来查找问题和求助于其他人,来寻求一个解决方案。但我在其中学到不少东西,我会把我已经使用XHTML后应该知道的都告诉你。
注意我这里提及的问题只会发生在能正确处理
application/xhtml+xmlMIME类型的用户代理中,而因此XHTML被作为XML。这也可能是这里不提及XHTML的早期使用的原因——很少有人使用这样的浏览器,所以几乎不会有人因只伺服为text/html的XHTML所烦忧。今天,实际上把XHTML伺服为
application/xhtml+xml正慢慢变得平常。我所知道的理由有两个:- 使用Firefox,Mozilla,Opera,Safari和其他兼容XHTML浏览器的人数增加了很多,所以你不再仅仅为自己和伙伴这样做。嗯。或许你就这样做,当将影响更多人。
- 在web开发者之间,对XHTML的真正面目是什么的觉醒越来越多了。使用XHTML已经有多次多时的热烈的讨论,尤其是伺服为
text/html的时候。如果你参与了任何一次讨论,你知道我在说什么。
假如你,像我,决定实现某些类型的content negotiation和在传送XHTML的时候使用正确的媒体类型,你需要知道什么能(和将)在你发布的文档中发生,并且知道怎样避免问题的发生。对于对content negotiation同进行content negotiation的脚本例子有兴趣的读者,我推荐你阅读Content Negotiation和Serving up XHTML with the correct MIME type。还有很多这种类型的文章,但这是我读到的最精彩的两篇。
每一个基本的教程都有一些HTML和XHTML的明显区别:元素和属性名字使用小写,属性值总要用引号。不要使用简化属性,确保所有的元素都有结束标签和没有不正确的嵌套等等。但是,当XHTML伺服为
application/xhtml+xml时还需要知道更多东西。良好的结构是必须的
文档必须是良好的结构(well-formed)的XML(跟合法的(valid)XHTML不必然相同)。就是必须,不是可能。
如果文档结构不好,符合标准的浏览器(当前我知道Mozilla,Firefox,Netscape,Camino,Opera,Safari和OmniWeb——相当多的浏览器除了IE)将会显示错误信息并且以某种方式中止处理文档。
此外,这还意味着不再使用未编码的"&"号。
XML声明可能是必须的
如果要使用UTF-8或者UTF-16以外的变法,必须要XML声明,除非HTTP头已经提供编码。
在HTTP头中是否要指定字符编码有些模糊,Architecture of the World Wide Web, Volume One: Media Types for XML这样写的:
总体上,不应该在协议头为XML数据指定字符编码,因为数据本身已描述。
另一方面,XHTML 1.0, Second Edition: Character Encoding写到:
为了让文档使用指定的字符编码,最好的办法是保证web服务器发送正确的头。
就是说,在XML声明中指定字符编码是好的习惯:
<?xml version="1.0" encoding="iso-8859-1"?>只有五个实体是安全的
只有五个预定义的实体(
<,>,&,", 和')的支持是有保证的。其他的可能完全被忽略或者直接输出。比如,如果XHTML文档包含如 或者”的实体,Safari会直接地输出。Opera反而选择忽略未知的实体,同时Mozila家族会认得这些实体并且就像HTML中“如果文档引用公共的映射浏览器伪DTD目录中的标识符并且没有单独声明的文档”
来处理。使用UTF-8字符编码是最受推荐的,让你(几乎)可以使用你需要键入文档的任意字符,不需要实体或者字符编号。如果你不能或不愿使用UTF-8,数字式的字符编号是可以支持和安全使用的。
SGML式注释的内容可能会被忽略
SGML注释(HTML风格注释,
<!-- 注释 -->)可能会(并且会)被浏览器当作注释,就算是在script或者style元素内部使用。在HTML中,普遍地把
script和style的内容装入注释中,为的是在不认识script或style元素的浏览器中隐藏他们,并且在页面上把其内容生成平白文本。在XHTML中,这样做会引起浏览器忽略掉注释里的任何内容。
在老的浏览器中隐藏
script和style的习惯可以追溯到1990年代中期。我的经验是,有如此表现的浏览器是十分罕见的,所以你可以安全地忽略它们,并且停止在脚本和样式中装入SGML式注释,就算你使用的是HTML。脚本和样式元素的内容也被当作XML
样式和脚本元素是PCDATA(parsed character data,解析字符数据)块,不是CDATA(character data,字符数据)块。因此,在其内看起来像XML的任何东西都会被当作XML来解析,并且会引发错误除非是良构的。
为了在
script或style块中使用<、&或者--,你需要用CDATA :<script type="text/javascript"><![CDATA[...]]></script>
在CDATA里,你可以任何顺序的字符,它们不会被当作XML来解析(除了结束CDATA部分]]>)。
需要以
text/html发送的文档中,CDATA部分的起始和结束标签需要注释掉,以便在不能处理CDATA部分的浏览器中隐藏:<script type="text/javascript">// <![CDATA[...// ]]></script>
<style type="text/css">/* <![CDATA[ */.../* ]]> */</style>
如果要确保很老的浏览器隐藏CDATA部分,需要使用更为复杂的方法,像在Ian Hickson的Sending XHTML as text/html Considered Harmful中描述的那样:
<script type="text/javascript"><!--//--><![CDATA[//><!--...//--><!]]></script>
<style type="text/css"><!--/*--><![CDATA[/*><!--*/.../*]]>*/--></style>
一个更好的办法可能是在发送
text/html的文档前使用content negotiation脚本来删除任何CDATA部分。当然,最聪明和安全的途径是把所有的CSS和JavaScript都移动到外部文件中,但不总是现实的做法。
没有会自动补全的元素
在HTML中,假如表格的
tbody元素漏写的话浏览器会自动补全,而XHTML不会。如果你没有清楚地添加tbody,它就不会出现。在编写CSS选择器和JavaScript的时候请铭记在心。用document.write编写的脚本不再工作
在XHTML中使用JavaScript,
document.write不会工作。Ian Hickson在Why document.write() doesn’t work in XML解释了原因。你需要使用document.createElementNS()代替。关于更多可以在Experts Exchange中的论坛主题中找到。这也是Google AdSense不在XHTML中工作的原因之一。那些希望以application/xhtml+xml伺服XHTML并且使用Google广告的人,这儿有一个解决办法:Simon Jessey的Making AdSense work with XHTML。尽管有点麻烦,但还是工作了(我在这里也使用了),同时被Google所认可。
引入样式元素
在XHTML中,为了兼容定义CSS规则的XML方法,你应该使用XML样式表声明(访问 XHTML 1.0, Second Edition: Referencing Style Elements when serving as XML的XML样式表声明和Associating Style Sheets with XML documents的xml-stylesheet处理说明)。要载入外部CSS文件,我们需要使用
style元素,同时应该使用XML样式表声明来引入样式元素。为此,使用id属性给style元素一个分解的标识符,然后在XML样式表声明中引入该标识符:- <?xml-stylesheet href=”stylesheet1.css” type=”text/css”?>
- <?xml-stylesheet href=”#stylesheet2” type=”text/css”?>
- <!DOCTYPE html
- PUBLIC “-//W3C//DTD
XHTML 1.0 Strict//EN”
- [1] [2] 下一页
-
- 正确使用XHTML的冒险 相关文章:
- ·Windows XP SP2是否正版原版技巧
- ·Photoshop液化滤镜校正歪斜的人物头像教程
- ·在IE浏览器中正确显示PNG透明图片
- ·诺顿杀毒软件正式版用户找回密码的方法
- ·下载:Opera 9.25最终正式版
- ·Photoshop液化滤镜校正倾斜的人物头像
- ·免费绘图软件Paint.NET推出3.2正式版
- ·Photoshop较正偏色照片
- ·Avant浏览器11.6正式版发布
- ·卡巴斯基® 手机版正式线上发行
- 正确使用XHTML的冒险 相关软件
- ·《古墓丽影十周年纪念版》正式版地图任我游工具
- ·《冰封王座》地图:英雄无敌圣战之日V1.07正式版
- ·《冰封王座》地图:幻想群侠传II-3.86正式版
- ·《猎杀潜航3》修改器修正版
- ·《荣誉骑士》热门MHR1.7汉化修正版
- ·《仙剑十年回顾》电子图书(修正版)
- ·《征途》正式版完整客户端下载
- ·《踢踢球》公测正式版完整客户端
- ·正义与邪恶的较量:刑庭法官
- ·秘书长——一场正义与腐败的权利博弈
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:事半功倍 迅雷BT全速下载大法
下一篇:Javascript强制把你的网站设置为访客的首页的代码
精品推荐
热点TOP10
- ·关于web.xml配置的详细说明
- ·XSL/XML网页制作入门,入门到精通
- ·XML轻松学习手册(三):XML的术语
- ·XML轻松学习手册(一):XML快速入门
- ·XML Schema定义元素的基本知识
- ·用XML+JSP实现网页内容动态显示的方案
- ·自定义应用程序配置文件(app.config)
- ·XML轻松学习手册(二):XML概念
- ·XSL教程:了解基础知识关于XSL
- ·使用标签显示完整的svg图像
- ·XML轻松学习手册(四):XML语法
- ·XHTML标签写法应该注意的问题
- ·利用XMLHTTP无刷新添加数据
- ·如何使用XML实现多渠道接入网站的构架
- ·XHTML教程,简单认识XHTML基础知识
- ·常用的XHTML标签的使用技巧介绍
- ·网页设计学习XHTML应用小结
- ·XHTML 1.0 参考
- ·Xml 串行话对象与反串行实例
- ·XQuery 初学者入门教程:XQuery 术语和语法
特别推荐
