zoukankan      html  css  js  c++  java
  • javascript判断浏览器类型与版本

    要想写出跨浏览器的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,否则返回1
    09.IEVersion = (" " + (/*@cc_on @_jscript_version  @*/-1)).slice(-1)
    10. 
    11.//基于条件编译的嗅探脚本,还有如下几个:
    12.IE8=@cc_on @_jscript_version == 5.8 ? true : @false
    13.IE7=@cc_on @_jscript_version == 5.7 ? true : @false
    14.IE6=@cc_on @_jscript_version == 5.6 ? true : @false
    15.IE55=@cc_on @_jscript_version == 5.5 ? true : @false
    16. 
    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.html
    02.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());

    02.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 2
    10. 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/),

    好了,基本就是这样了,如果你有什么发现,也敬请拿出来分享一下!

    http://www.hunuo.com/zhuanti/web20/9785.html

  • 相关阅读:
    oracle日期格式转换 to_date()
    YAML中使用Jinja模板以{{ foo }}开头需要整行加双引号
    linux查看修改线程默认栈空间大小(ulimit -s)
    理解一条语句:SELECT difference(sum("value")) FROM "mq_enqueue" WHERE "channel" =~ /ActiveMQ_TEST/ AND $timeFilter GROUP BY time($interval)
    zookeeper客户端连接报错
    docker swarm join 报错
    redis make报错
    302重定向问题
    svn安装配置
    mysql5.7.22tar包安装
  • 原文地址:https://www.cnblogs.com/load/p/2267198.html
Copyright © 2011-2022 走看看