由 IE8 User-Agent 更新想到的
来源:gracecode.com 发布时间:2009-01-12 18:33:00
标签:ie8,User-Agent,浏览器,代码
IE 开发团队更改了 IE8 的 User-agent ,更改的部分信息如下:
IE8 on Windows Vista (Compatibility View)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)
IE8 on Windows Vista
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)
除了 IE8 因 Compatibility View 功能造成单浏览器“原生”多个 User-agent 外,还有个情况也变得非常的有趣,就是几乎每个浏览器都将自己渲染引擎的标识加入到了 User-agent 中(Gecko、Webkit、Trident)。
User-agent 信息常被用作检测浏览器类型和版本的最佳途径(YUI、jQuery),而上述的改动是否意味着以后类似的检测脚本会变得更加的复杂?回答这个问题之前,让我们看下 Mootools 如何检测浏览器信息
var Browser = {
Engine: {name: 'unknown', version: 0},
Features: {
xpath: !!(document.evaluate), // 是否支持 XPath
air: !!(window.runtime), // 是否支持 Air 扩展
query: !!(document.querySelector) // 是否支持 CSS 选择器
},
Engines: {
// 判断 Opera
presto: function() {
return (!window.opera) ?
false : ((arguments.callee.caller) ?
960 : ((document.getElementsByClassName) ? 950 : 925));
},
// 判断 IE,根据 ActiveX 和 特有的 XMLHttpRequest 对象
trident: function() {
return (!window.ActiveXObject) ?
false : ((window.XMLHttpRequest) ? 5 : 4);
},
// Webkit 核心的浏览器,如 Safari 和 Chrome
webkit: function() {
return (navigator.taintEnabled) ?
false : ((Browser.Features.xpath) ?
((Browser.Features.query) ? 525 : 420) : 419);
},
// Mozilla Gecko 核心浏览器,如 Firefox
gecko: function() {
return (document.getBoxObjectFor == undefined) ?
false : ((document.getElementsByClassName) ? 19 : 18);
}
}
};
Browser.detect = function() {
for (var engine in this.Engines){
var version = this.Engines[engine]();
// 如果具有特定的浏览器对象
if (version){
this.Engine = {name: engine, version: version};
this.Engine[engine] = this.Engine[engine + version] = true;
break;
}
}
return {name: engine, version: version};
};
Browser.detect();
上述代码让人感到耳目一新,它是根据浏览器功能而非 User-agent 判断浏览器类型。仔细考虑一下,User-agent 信息可以被伪造,同时浏览器厂商日后也会更改 User-agent 信息,所以此种情况下根据功能判断浏览器类型会可靠得多。
延伸下此策略,比如我们会编写这样的代码:
if (ie) { // ie only } else { // other browsers }
这样因浏览器差异而编写的“硬代码”,往往会造成维护两套实际相同功能的代码,并造成逻辑上的混乱。何不先抛开浏览器兼容的问题,然后再判断相应的对象是否被浏览器支持。
OK,有关编程思想的问题就不继续了…
-- Split --
PS,目前判断是否是 IE8 可这样编写(来自 舜子):
var isIE8 = !!window.XDomainRequest;


猜你喜欢
- JS在firefox中的兼容性问题,自己也经常遇到.此文是网上资料,不过时间较久不记得原址了...1. document.form.item
- 我就废话不多说了,直接上代码吧!【code】import numpy as npthreshold=2a=np.array([[1,2,3]
- 今天又遇到修改MySQL默认字符集编码的问题,折腾了半天解决了,赶快记录下来,以后就不用每次折腾了。查看MySQL字符集的命令是“show
- 写此篇文章,我花10块购买了域名ssw.ski。目的是编写python脚本,通过dnspod api获取个人域名内的dns解析记录,免登录实
- 目录1. 前言2. 实战一下2-1 进入虚拟环境,创建一个项目及 App2-2 创建模板目录并配置 set
- fileinput模块可以遍历文本文件的所有行.它的工作方式和readlines很类似,不同点在于,它不是将全部的行读到列表中而是创建了一个
- 本文实例讲述了Python设计模式之命令模式原理与用法。分享给大家供大家参考,具体如下:命令模式(Command Pattern):将请求封
- python jenkins 打包构建代码# pip install python-jenkinsimport jenkinsimport
- 我就废话不多说了,直接上代码吧!import torchimport torch.nn as nnfrom torch.autograd i
- 这章是结合之前学习的Tensforboard与Transforms的一个练习。直接上代码:from PIL import Imagefrom
- 前言本文提供Python上传minio以及阿里oss文件工具,给自己留个记录。环境依赖安装minio以及oss2依赖pip install
- 作为一个mod_python模块的替代,你可以考虑使用mod_wsgi模块,此模块开发的时间比mod_python的开发时间离现在更近一些,
- 使用mysql主从复制的好处有:1、采用主从服务器这种架构,稳定性得以提升。如果主服务器发生故障,我们可以使用从服务器来提供服务。2、在主从
- Python3 abs() 函数描述abs() 函数返回数字的绝对值。语法以下是 abs() 方法的语法:abs( x )参数x-- 数值表
- 这篇文章主要介绍了Pandas数据离散化原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 一旦你准备好了翻译,如果希望在Django中使用,那么只需要激活这些翻译即可。在这些功能背后,Django拥有一个灵活的模型来确定在安装和使
- 最近使用python里的matplotlib库绘图,想在代码结束时显示图片看看,结果图片一闪而过,附上我原来代码:import matplo
- 写了一个抓taobao图片的爬虫,全是用if,for,while写的,比较简陋,入门作品。从网页http://mm.taobao.com/j
- 一、项目需求爬取排行榜小说的作者,书名,分类以及完结或连载二、项目分析目标url:“https://www.qidian.com/rank/
- 本文实例讲述了Python常见字符串操作函数。分享给大家供大家参考,具体如下:str.split(' ')1.按某一个字符分