JavaScript判斷瀏覽器類型與版本
要想寫出跨瀏覽器的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/),
好了,基本就是這樣了,如果你有什么發現,也敬請拿出來分享一下!
全站熱搜