JavaScript判斷瀏覽器類型與版本

作者: 司徒正美  來源: 博客園  發布時間: 2009-10-15 09:48  閱讀: 1244 次  推薦: 0   原文鏈接   [收藏]  

 

要想寫出跨瀏覽器的javascript,就必須懂得嗅探技術。這是瀏覽器大戰遺留下的大地雷,事已如此,只好認命,乖乖寫分支結構吧,函數就是這樣不知不覺中變長的。

先看單一瀏覽器的判斷,我們沒有必須去找navigator.userAgent的麻煩,我在國外的博客網站收集了如下hack,短小精悍:

 

ie = !+"\v1" ;
ie ='\v'=='v' ;
ie = 0//@cc_on+1;
ie = !!top.execScript;
ie = /*@cc_on!@*/!1;
ie8 = !!window.XDomainRequest;
 
//我自創的,如果是IE,會返回6,7,8代表ie6,ie7,ie8,否則返回1
IEVersion = (" " + (/*@cc_on @_jscript_version  @*/-1)).slice(-1)
 
//基于條件編譯的嗅探腳本,還有如下幾個:
IE8=@cc_on @_jscript_version == 5.8 ? true : @false
IE7=@cc_on @_jscript_version == 5.7 ? true : @false
IE6=@cc_on @_jscript_version == 5.6 ? true : @false
IE55=@cc_on @_jscript_version == 5.5 ? true : @false

ff = /a/[-1]=='a';
ff3 = (function  x(){})[-5]=='x';
ff2 = (function x(){})[-6]=='x';
 
safari=/a/.__proto__=='//';
safari = window.openDatabase;
 
chrome=/source/.test((/a/.toString+''));
 
opera=!!window.opera ;
opera=/^function (/.test([].sort);

還有判斷maxthon的:

 

//出處:http://www.cnblogs.com/xiarugu/archive/2009/02/02/1382293.html
function IsMaxthon()
{
try{
window.external.max_invoke("GetHotKey");
return true;
}catch(ex){
return false;
}
}
alert(IsMaxthon());
//出處:http://bbs.maxthon.cn/archiver/?tid-148353.html
try{
if(external.max_version.indexOf("1.")==0){
var isMaxthon1 = 1;
}else{
var isMaxthon1 = 0;
}
}catch(e){
var isMaxthon1 = 0;
}

如果是想搞比較復雜的UI或者類庫,對于瀏覽器的判斷就要更嚴格一些,不能像上面那樣游兵散勇。

 

B=(function x(){})[-5]=='x'?'FF3':(function x(){})[-6]=='x'?'FF2':/a/[-1]=='a'?'FF':'\v'==
'v'?'IE':/a/.__proto__=='//'?'Saf':/s/.test(/a/.toString)?'Chr':/^function \(/.test([].sort)?
'Op':'Unknown'

在Ext3的源碼中能找出如下現整的嗅探腳本:

 

ua = navigator.userAgent.toLowerCase(),
check = function(r){
return r.test(ua);
},
isOpera = check(/opera/),
isChrome = check(/chrome/),
isWebKit = check(/webkit/),
isSafari = !isChrome && check(/safari/),
isSafari2 = isSafari && check(/applewebkit\/4/), // unique to Safari 2
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/),

好了,基本就是這樣了,如果你有什么發現,也敬請拿出來分享一下!

 

 

 

 

 

0
0
 
標簽:javascript
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()