JavaScript获取浏览器信息
上一篇 /
下一篇 2016-08-12 11:09:05
/ 个人分类:安全测试
要想写出跨浏览器的javascript,就必须懂得嗅探技术。这是浏览器大战遗留下的大地雷,事已如此,只好认命,乖乖写分支结构吧,函数就是这样不知不觉中变长的。
先看单一浏览器的判断,我们没有必须去找navigator.userAgent的麻烦,我在国外的博客网站收集了如下hack,短小精悍:
<br>
ie = !+"/v1" ;<br>
ie ='/v'=='v' ;<br>
ie = 0//@cc_on+1;<br>
ie = !!top.execScript;<br>
ie = /*@cc_on!@*/!1;<br>
ie8 = !!window.XDomainRequest;<br>
<br>
//我自创的,如果是IE,会返回6,7,8代表ie6,ie7,ie8,否则返回1<br>
IEVersion = (" " + (/*@cc_on @_jscript_version @*/-1)).slice(-1)<br>
<br>
//基于条件编译的嗅探脚本,还有如下几个:<br>
IE8=@cc_on @_jscript_version == 5.8 ? true : @false<br>
IE7=@cc_on @_jscript_version == 5.7 ? true : @false<br>
IE6=@cc_on @_jscript_version == 5.6 ? true : @false<br>
IE55=@cc_on @_jscript_version == 5.5 ? true : @false<br>
<br>
<br>
ff = /a/[-1]=='a';<br>
ff3 = (function x(){})[-5]=='x';<br>
ff2 = (function x(){})[-6]=='x';<br>
<br>
safari=/a/.__proto__=='//';<br>
safari = window.openDatabase;<br>
<br>
chrome=/source/.test((/a/.toString+''));<br>
<br>
opera=!!window.opera ;<br>
opera=/^function (/.test([].sort);<br>
还有判断maxthon的:
<br>
//出处:http://www.cnblogs.com/xiarugu/archive/2009/02/02/1382293.html<br>
function IsMaxthon()<br>
{<br>
try{<br>
window.external.max_invoke("GetHotKey");<br>
return true;<br>
}catch(ex){<br>
return false;<br>
}<br>
}<br>
alert(IsMaxthon());<br>
<br>
//出处:http://bbs.maxthon.cn/archiver/?tid-148353.html<br>
try{<br>
if(external.max_version.indexOf("1.")==0){<br>
var isMaxthon1 = 1;<br>
}else{<br>
var isMaxthon1 = 0;<br>
}<br>
}catch(e){<br>
var isMaxthon1 = 0;<br>
}<br>
如果是想搞比较复杂的UI或者类库,对于浏览器的判断就要更严格一些,不能像上面那样游兵散勇。
<br>
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'<br>
在Ext3的源码中能找出如下现整的嗅探脚本:
<br>
ua = navigator.userAgent.toLowerCase(),<br>
check = function(r){<br>
return r.test(ua);<br>
},<br>
isOpera = check(/opera/),<br>
isChrome = check(/chrome/),<br>
isWebKit = check(/webkit/),<br>
isSafari = !isChrome && check(/safari/),<br>
isSafari2 = isSafari && check(/applewebkit//4/), // unique to Safari 2<br>
isSafari3 = isSafari && check(/version//3/),<br>
isSafari4 = isSafari && check(/version//4/),<br>
isIE = !isOpera && check(/msie/),<br>
isIE7 = isIE && check(/msie 7/),<br>
isIE8 = isIE && check(/msie 8/),<br>
isIE6 = isIE && !isIE7 && !isIE8,<br>
isGecko = !isWebKit && check(/gecko/),<br>
isGecko2 = isGecko && check(/rv:1/.8/),<br>
isGecko3 = isGecko && check(/rv:1/.9/),<br>
相关阅读:
- (转) selenium WebDriver 对浏览器标签页的切换 (shingo0109, 2016-7-01)
- WebDriver切换浏览器窗口 (sll101010, 2016-7-01)
- selenium2调用浏览器-InJava (wwyfriend, 2016-7-12)
- selenium-浏览器的启动 (影灵, 2016-7-13)
- “死亡”倒计时:Firefox下月将禁用不重要的Flash内容 (zaza9084, 2016-7-21)
- python3.x爬取美团信息 (雷哥V5, 2016-7-22)
- 推荐几款浏览器兼容测试工具 (xuquan, 2016-7-26)
- 如何让Chrome和Firefox崩溃 研究人员发现新漏洞 (zaza9084, 2016-7-29)
- 浏览器同源策略 (棉花糖西西鲁, 2016-8-01)
- .VuGen会修改录制浏览器中的代理服务器设置吗? (smilesun666, 2016-8-04)
收藏
举报
TAG:
信息
浏览器