Spiga

你的网站「被兼容」了吗?

2009-09-17 15:35 by Cat Chen, 4265 visits, 收藏, 编辑

一般情况下,我们只会讨论我们的网站如何主动兼容某某浏览器,被动地等待浏览器来兼容我们的网站是不切实际的幻想——哪个浏览器会那么伟大,原意主动为一个不兼容的网站而作出改变呢?IE8就是这样一个伟大的浏览器,Microsoft就是一家这样伟大的企业。

故事是这样的,我们有一小段JavaScript依赖于userAgent属性,同样是用IE8进行浏览,在测试环境上userAgent显示为MSIE 7.0,而在生产环境上userAgent显示为MSIE 8.0。为什么会这样呢?打开Developer Toolbar后,发现原来是Browser Mode这个开关在搞鬼——当Browser Mode是Internet Explorer 8的时候,userAgent就是MSIE 8.0;当Browser Mode是Internet Explorer 8 Compatibility View(兼容性视图)或Internet Explorer 7的时候,userAgent就是MSIE 7.0了。

接下来的问题是,我们并没有刻意去拨动这个开关啊,两个相同的页面怎么在不同的环境中默认显示为不同的Browser Mode呢?我的猜想是,这是由于域名不同而引起的——Microsoft自己维护着一个Compatibility View List,当访问该List中的站点时,IE8会自动启用Compatibility View,也就是将Browser Mode切换到Internet Explorer 8 Compatibility View。接着我在地址栏输入以下地址,检查了一下我本地最近更新的List:

res://iecompat.dll/iecompatdata.xml

事实表明,我们测试用的baidu.com域名确实在上述List中,但部署到baidu.jp后也就脱离了该List。这就很好地解释了我们遇到问题,同时也提醒我们域名已经成为了IE8测试中不可避免的一个紧耦合因素。在过去,我们可以简单地认为,部署在不同URL的相同页面在同一款浏览器中显示出来总是一样的。但现在我们必须修正这句话了,仅当不同URL都基于同一个域名时上述命题仍然成立。

通过这个案例,希望能让大家了解到在开发与测试过程中保持域名一致的重要性。如果你开发的页面要部署到example.com,你最好在develop.example.com上开发,在test.example.com上测试,然后再部署。如果你需要在本机进行开发测试,也要通过改hosts模拟一个localhost.example.com来进行测试与调试,以确保代码在最终部署后能执行在相同的环境下。

Add your comment

26 条回复

  1. #1楼 菩提树下的杨过      2009-09-17 15:39
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> 一般我还是习惯于用这行代码明确告诉IE8:请以IE7兼容模式解析本网页
     回复 引用 查看   
  2. #2楼[楼主] Cat Chen      2009-09-17 15:43
    @菩提树下的杨过
    你所说的meta仅仅能够调整Document Mode,对我所说的Browser Mode一点影响都没有。这是两个独立的开关。
     回复 引用 查看   
  3. #3楼 小眼睛老鼠      2009-09-17 15:51
    因该有办法设置的吧
     回复 引用 查看   
  4. #4楼[楼主] Cat Chen      2009-09-17 16:01
    @小眼睛老鼠
    这个List是可以通过如下方法opt-out的:
    <meta http-equiv="X-UA-Compatible" content="IE=8" />

    但这使得Browser Mode和Document Mode都是IE8。如果想要Document Mode是IE7,Browser Mode是IE8,进了List就没办法了。
     回复 引用 查看   
  5. #5楼 YJJ      2009-09-17 16:30
    感觉如此一样不是头更大了?
     回复 引用 查看   
  6. #6楼[楼主] Cat Chen      2009-09-17 16:44
    @YJJ
    可以这样说,假如你的网站被Microsoft特别照顾然后加进List的话。
     回复 引用 查看   
  7. #7楼 小鬼00[未注册用户]2009-09-17 16:46
    不要把微软说得这么伟大,它只是照顾一下IE7的模式而已.
     回复 引用   
  8. #8楼[楼主] Cat Chen      2009-09-17 16:54
    @小鬼00
    看不出我在反讽吗?
     回复 引用 查看   
  9. #9楼 cloudgamer      2009-09-17 17:03
    没想到还有这样的事儿
     回复 引用 查看   
  10. #10楼 Nick Wang (懒人王)      2009-09-17 17:08
    完全是hack啊,这list会动态更新么?
     回复 引用 查看   
  11. #11楼 xiaosuo      2009-09-17 18:25
    太没有想到了
     回复 引用 查看   
  12. #12楼 NormRen      2009-09-17 18:31
    从这篇文章主要看出楼主在百度,其他内容略过。
     回复 引用 查看   
  13. #13楼 kuku      2009-09-17 18:36
    哈哈,不知道说什么好了,如果它伟大,那么我就不会那么辛苦了
     回复 引用 查看   
  14. #14楼 oldmoon[未注册用户]2009-09-17 18:55
    IE8本来就有兼容性视力按钮,在网址框的右边
     回复 引用   
  15. #15楼[楼主] Cat Chen      2009-09-17 19:16
    @Nick Wang (懒人王)
    这个List会更新。在你在用IE8的过程中,如果你按下了那个Compatibility View的按钮,你就相当于向Microsoft报告这个网站需要使用Compatibility View。Microsoft会定期分析IE8汇报上来的数据,然后通过Windows Update更新所有IE8的List。
     回复 引用 查看   
  16. #16楼[楼主] Cat Chen      2009-09-17 19:17
    @NormRen
    长期订阅我博客的人都知道啊……
     回复 引用 查看   
  17. #17楼[楼主] Cat Chen      2009-09-17 19:18
    @oldmoon
    但如果有太多人对着你的网站点这个按钮,Microsoft就会把你的网站放进List里面,之后任何人用IE8浏览你的网站这个按钮默认都是按下状态的。并且,在这时候按钮不会显示出来,不开启Developer Toolbar就不可能取消这个按钮的按下状态。
     回复 引用 查看   
  18. #18楼 NormRen      2009-09-17 23:33
    请教一下,LZ获取userAgent MSIE 8.0主要是用于统计吗?
     回复 引用 查看   
  19. #19楼[楼主] Cat Chen      2009-09-18 00:57
    @NormRen
    不完全是。
     回复 引用 查看   
  20. #20楼 zoti      2009-09-18 08:16
    "IE8就是这样一个伟大的浏览器,Microsoft就是一家这样伟大的企业。"
    這句話很惡心。

    IE8如此,反而把問題搞得很復雜。

    kuku說的好:“如果它伟大,那么我就不会那么辛苦了”
     回复 引用 查看   
  21. #21楼[楼主] Cat Chen      2009-09-18 09:11
    @zoti
    @kuku
    我上面解释了,这句话纯粹是反讽。
     回复 引用 查看   
  22. #22楼 catchenfan[未注册用户]2009-09-18 09:35
    如果从用户角度来考虑IE8这个List, 是不是还那么恶心?
     回复 引用   
  23. #23楼[楼主] Cat Chen      2009-09-18 11:05
    @catchenfan
    从用户的角度来说,这个List是有意义的——假若很多用户都用Compatibility View打开一个网站,就让所有人都用Compatibility View打开这个网站,这个推理本身没什么问题。只是它确实干扰了开发人员的测试。
     回复 引用 查看   
  24. #24楼 Nick Wang (懒人王)      2009-09-26 17:07
    今天装IE8发现安装后是有提示问你要不要打开这个功能的,而且在工具-〉兼容性视图设置 中是可以修改的。
     回复 引用 查看   
  25. #25楼[楼主] Cat Chen      2009-09-27 00:46
    @Nick Wang (懒人王)
    是可以设置的,但一般用户根本不会管IE8首次运行向导,直接express setup,或者一路next。
     回复 引用 查看   
  26. #26楼 ADD~``[未注册用户]2009-10-06 15:12
    看了楼主的文章 果然获益匪浅。。
     回复 引用