锁定老帖子 主题:有趣的浏览器检测
精华帖 (0) :: 良好帖 (10) :: 新手帖 (19) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-26
最后修改:2010-10-18
在写跨浏览器的js程序中,检测浏览器是一个很重要的工作。我们不时要为不同的浏览器写分支代码。如下是一种:
//添加事件工具函数 function addEvent(el,type,handle){ if(el.addEventListener){//for standard browses el.addEventListener(type,handle,false); }else if(el.attachEvent){//for IE el.attachEvent("on"+event,handle); }else{//other el["on"+type]=handle; } } 1,第一种检测浏览器方式称为 user-agent 检测方式。是最古老的,它检测目标浏览器的确切型号,包括浏览器的名称和版本。其实就是一个字符串,用navigator.userAgen或navigator.appName获取。如下:
function isIE(){ return navigator.appName.indexOf("Microsoft Internet Explorer")!=-1 && document.all; } function isIE6() { return navigator.userAgent.split(";")[1].toLowerCase().indexOf("msie 6.0")=="-1"?false:true; } function isIE7(){ return navigator.userAgent.split(";")[1].toLowerCase().indexOf("msie 7.0")=="-1"?false:true; } function isIE8(){ return navigator.userAgent.split(";")[1].toLowerCase().indexOf("msie 8.0")=="-1"?false:true; } function isNN(){ return navigator.userAgent.indexOf("Netscape")!=-1; } function isOpera(){ return navigator.appName.indexOf("Opera")!=-1; } function isFF(){ return navigator.userAgent.indexOf("Firefox")!=-1; } function isChrome(){ return navigator.userAgent.indexOf("Chrome") > -1; }
2,第二种称为 对象/特征 检测方式,这是一种判断浏览器能力的方式,也是目前流行的方式。即在使用一个对象之前检测它是否存在。上面提到的addEvent方法中就使用了该方式。.addEventListener是w3c dom标准方式,而IE使用自己特有attachEvent。以下列举几个: a,talbe.cells只有IE/Opera支持。 b,innerText/insertAdjacentHTML除Firefox外,IE6/7/8/Safari/Chrome/Opera都支持。 c,window.external.AddFavorite用来在IE下添加到收藏夹。 d,window.sidebar.addPanel用来在FF下添加到收藏夹。
3,第三种很有趣,暂且称为 浏览器缺陷或bug 方式,即某些表现不是浏览器厂商刻意实现的。如下:
var isIE = !+"\v1"; var isIE = !-[1,]; var isIE = "\v"=="v"; isSafari=/a/.__proto__=='//'; isOpera=!!window.opera; 最经典的莫过于 !-[1,] 的判断方式,目前最少代码判断IE的方式,只需6个byte。这是个俄国人 发现的。利用了数组[1,]的length。还有来自英国的年轻 James Padolsey 利用IE条件注释 var ie = (function(){ var undef, v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i'); while ( div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->', all[0] ); return v > 4 ? v : undef }());
被称为史上最有创意的IE判断。
注1:isIE = "\v" == "v" 方式IE9已经修复该bug,不能用此方式判断IE浏览器了(2010-6-29用IE9 pre3测试的)
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-02-26
我的工具库里是这样检测的:
var b = { msie: /msie/.test(ua) && !/opera/.test(ua), opera: /opera/.test(ua), safari: /webkit/.test(ua) && !/chrome/.test(ua), firefox: /firefox/.test(ua), chrome: /chrome/.test(ua) }; var vMark = ""; for (var i in b) { if (b[i]) { vMark = "safari" == i ? "version" : i; break; } } b.version = vMark && RegExp("(?:" + vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0"; |
|
返回顶楼 | |
发表时间:2010-02-26
lz,提醒一下,user-agent检测的ie版本不准确,经常出错
|
|
返回顶楼 | |
发表时间:2010-03-01
如果要判断浏览器,推荐做法是UA嗅探。
如果是在使用某一特性之前的检测,推荐做法是特性检测。 最后,特性检测并非浏览器检测。 |
|
返回顶楼 | |
发表时间:2010-03-01
咋一看,没看懂。有空慢慢研究。
|
|
返回顶楼 | |
发表时间:2010-03-01
如果想自己做个库啥的
还是进行嗅探后,统一到一个逻辑document对象上在调用比较方便吧 |
|
返回顶楼 | |
发表时间:2010-03-01
var ua = navigator.userAgent.toLowerCase(), check = function(r){ return r.test(ua); }, isOpera = check(/opera/), isChrome = check(/\bchrome\b/), isWebKit = check(/webkit/), isSafari = !isChrome && check(/safari/), isSafari2 = isSafari && check(/applewebkit\/4/), isSafari3 = isSafari && check(/version\/3/), isSafari4 = isSafari && check(/version\/4/), isIE = !isOpera && check(/msie/), isIE7 = isIE && check(/msie 7/), isIE8 = isIE && check(/msie 8/), isIE6 = isIE && !isIE7 && !isIE8, isGecko = !isWebKit && check(/gecko/), isGecko2 = isGecko && check(/rv:1\.8/), isGecko3 = isGecko && check(/rv:1\.9/), isBorderBox = isIE && !isStrict, isWindows = check(/windows|win32/), isMac = check(/macintosh|mac os x/), isAir = check(/adobeair/), isLinux = check(/linux/) 简洁,简单 |
|
返回顶楼 | |
发表时间:2010-03-02
jquery都已经舍去这种检查方法. 改用特性检测.
|
|
返回顶楼 | |
发表时间:2010-03-02
userAgent 探测有个问题是,如果用户用userAgent的工具更改的话,探测结果会被误导。
这种情况用特性判断比较好,不管userAgent怎么变,浏览器的本质都是不变的 |
|
返回顶楼 | |
发表时间:2010-03-02
某些情况下还是要特性判断结合下userAgent,像要统计客户端浏览器的具体的种类(比如那些用了ie内核的浏览器比如傲游或者360之类)的时候,就只好从userAgent里找关键字了
|
|
返回顶楼 | |