要想写出跨浏览器的javascript,就必须懂得嗅探技术。这是浏览器大战遗留下的大地雷,事已如此,只好认命,乖乖写分支结构吧,函数就是这样不知不觉中变长的。
先看单一浏览器的判断,我们没有必须去找navigator.userAgent的麻烦,我在国外的博客网站收集了如下hack,短小精悍:
ie = !+"/v1" ;
02.ie =''/v''==''v'' ;03.ie = 0//@cc_on+1;04.ie = !!top.execScript;05.ie = /*@cc_on!@*/!1;06.ie8 = !!window.XDomainRequest;07. 08.//我自创的,如果是IE,会返回6,7,8代表ie6,ie7,ie8,否则返回109.IEVersion = (" " + (/*@cc_on @_jscript_version @*/-1)).slice(-1)10. 11.//基于条件编译的嗅探脚本,还有如下几个:12.IE8=@cc_on @_jscript_version == 5.8 ? true : @false13.IE7=@cc_on @_jscript_version == 5.7 ? true : @false14.IE6=@cc_on @_jscript_version == 5.6 ? true : @false15.IE55=@cc_on @_jscript_version == 5.5 ? true : @false16. 17. 18.ff = /a/[-1]==''a'';19.ff3 = (function x(){})[-5]==''x'';20.ff2 = (function x(){})[-6]==''x'';21. 22.safari=/a/.__proto__==''//'';23.safari = window.openDatabase;24. 25.chrome=/source/.test((/a/.toString+''''));26. 27.opera=!!window.opera ;28.opera=/^function (/.test([].sort); |
还有判断
//出处:http://www.cnblogs.com/xiarugu/archive/2009/02/02/1382293.html02.function IsMaxthon()03.{04. try{05. window.external.max_invoke("GetHotKey");06. return true;07. }catch(ex){08. return false;09. }10.}11.alert(IsMaxthon()); |
//出处:http://bbs.maxthon.cn/archiver/?tid-148353.html02.try{03. if(external.max_version.indexOf("1.")==0){04. var isMaxthon1 = 1;05. }else{06. var isMaxthon1 = 0;07. }08.}catch(e){09. var isMaxthon1 = 0;10.} |
如果是想搞比较复杂的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(),02. check = function(r){03. return r.test(ua);04. },05. isOpera = check(/opera/),06. isChrome = check(/chrome/),07. isWebKit = check(/webkit/),08. isSafari = !isChrome && check(/safari/),09. isSafari2 = isSafari && check(/applewebkit//4/), // unique to Safari 210. isSafari3 = isSafari && check(/version//3/),11. isSafari4 = isSafari && check(/version//4/),12. isIE = !isOpera && check(/msie/),13. isIE7 = isIE && check(/msie 7/),14. isIE8 = isIE && check(/msie 8/),15. isIE6 = isIE && !isIE7 && !isIE8,16. isGecko = !isWebKit && check(/gecko/),17. isGecko2 = isGecko && check(/rv:1/.8/),18. isGecko3 = isGecko && check(/rv:1/.9/), |
好了,基本就是这样了,如果你有什么发现,也敬请拿出来分享一下!