检測浏览器。注意浏览器推断顺序,主要是基于userAgent做推断。

//检測浏览器

var client = function(){

    var engine = {

        ie:0,

        gecko:0,

        webkit:0,

        khtml:0,

        opera:0,

        ver:null

    };

    var browser = {

        //浏览器

        ie: 0,

        firefox: 0,

        safari: 0,

        konq: 0,

        opera: 0,

        chrome: 0,

        ver:null

    };

    var ua = navigator.userAgent;

    //浏览器检測有顺序

    if(window.opera){//opera伪装,所以优先检測

        engine.ver = browser.ver = window.opera.version();

        engine.opera = browser.opera = parseFloat(engine.ver);

    } else if(/AppleWebKit\/(\S+)/.test(ua)){

        engine.ver = RegExp["$1"];

        engine.webkit = parseFloat(engine.ver);





        //确定是 Chrome 还是 Safari

        if (/Chrome\/(\S+)/.test(ua)){

            browser.ver = RegExp["$1"];

            browser.chrome = parseFloat(browser.ver);

        } else if (/Version\/(\S+)/.test(ua)){

            browser.ver = RegExp["$1"];

            browser.safari = parseFloat(browser.ver);

        } else {

            //近似地确定版本

            var safariVersion = 1;

            if (engine.webkit < 100){

                safariVersion = 1;

            } else if (engine.webkit < 312){

                safariVersion = 1.2;

            } else if (engine.webkit < 412){

                safariVersion = 1.3;

            } else {

                safariVersion = 2;

            }





            browser.safari = browser.ver = safariVersion;

        }









    }else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){

        engine.ver = browser.ver = RegExp["$1"];

        engine.khtml = browser.konq = parseFloat(engine.ver);

    }else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){

        engine.ver = RegExp["$1"];

        engine.gecko = parseFloat(engine.ver);

        //确定是不是 Firefox

        if (/Firefox\/(\S+)/.test(ua)){

            browser.ver = RegExp["$1"];

            browser.firefox = parseFloat(browser.ver);

        }

    }else if (/MSIE ([^;]+)/.test(ua)){

        engine.ver = browser.ver = RegExp["$1"];

        engine.ie = browser.ie = parseFloat(engine.ver);

    }

    return {

        engine:engine,

        browser: browser

    };

}();

//调用

if (client.engine.webkit) { //if it’s WebKit 

 if (client.browser.chrome){ 

 //运行针对 Chrome 的代码 

 } else if (client.browser.safari){ 

 //运行针对 Safari 的代码 

 } 

} else if (client.engine.gecko){ 

 if (client.browser.firefox){ 

 //运行针对 Firefox 的代码 

 } else { 

 //运行针对其它 Gecko 浏览器的代码 

 } 

}

js识别不同浏览器的更多相关文章

  1. JS识别不同浏览器信息

    总所周知,不同浏览器兼容是不一致的,然而今天我在Coding的时候深深体会到那个痛苦,一样的代码在Firefox里面是没问题的,可以根据索引找到 对应的对象元素然后进行操作,但是同样的却获取不到对象元 ...

  2. 识别手机浏览器代码【C#和JS两种语言】

    C# 识别手机浏览器代码: public static bool MobileBrowserDetect() { bool bismobile = false; try { #region 包含and ...

  3. 浏览器兼容处理(HTML条件注释、CSSHack和JS识别)

    前面的话 本文中所有IEx+代表包含x及x以上:IEx-代表包含x及x以下,仅个人习惯.例:IE7+代表IE7.IE8…… 本文中所有例子全部经过测试,欢迎交流. HTML识别 条件注释法(IE10+ ...

  4. 通过JS检测360浏览器

    如何通过JS检测360浏览器? 尝试了一大堆方法,网上大多数办法都是通过navigator.userAgent来判断,这可能在几年前是行得通的,现在360userAgent输出来跟谷歌除了版本号其余一 ...

  5. 笔记:1.css样式,最前边加 @charset "utf-8";是为什么2.js判断各种浏览器的方法

    表明CSS文件的页面编码为UTF-8..如果这个CSS的文件编码也是UTF-8的话..那么在浏览器中看到的CSS文件的页面中中文的注释或者中文字体就可以正确显示为中文,如果CSS的文件编码和页面不一致 ...

  6. JS兼容各个浏览器的本地图片上传即时预览效果

    JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...

  7. JS获取当前浏览器的类型

    <script type=“text/javascript”> function isIE(){return navigator.appName.indexOf(“Microsoft In ...

  8. SlimerJS – Web开发人员可编写 JS 控制的浏览器

    SlimerJS 是一个提供给 Web 开发人员,可通过脚本编程控制的浏览器.它可以让你使用 Javascript 脚本操纵一个网页:打开一个网页,点击链接,修改的内容等,这对于做功能测试,页面自动机 ...

  9. js/jquery判断浏览器的方法小结

    在网站前端开发中,浏览器兼容性是前端开发框架要解决的第一个问题,要解决兼容性问题就得首先准确判断出浏览器的类型及其版本,而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道.今天我们把 ...

随机推荐

  1. easyui常用

    清空列表选中项 //easyui datagrid 清空勾选 $('#List').datagrid('clearSelections'); 扩展修改查询方法 function QueryList() ...

  2. Guava源码学习(五)EventBus

    基于版本:Guava 22.0 Wiki:EventBus 0. EventBus简介 提供了发布-订阅模型,可以方便的在EventBus上注册订阅者,发布者可以简单的将事件传递给EventBus,E ...

  3. 51nod 1649.齐头并进-最短路(Dijkstra)

    1649 齐头并进 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 在一个叫奥斯汀的城市,有n个小镇(从1到n编号),这些小镇通过 ...

  4. 牛客网 牛客练习赛7 B.购物-STL(priority_queue)

    B.购物 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 在遥远的东方,有一家糖果专卖店 这家糖果 ...

  5. (20)C#泛型

    泛型的定义:通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程时一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用. 优点: 1.省去了拆箱.装箱 2.提高安全性 3. ...

  6. BZOJ 2243 [SDOI2011]染色 (树链剖分)(线段树区间修改)

    [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6870  Solved: 2546[Submit][Status][Disc ...

  7. unity3d 场景配置文件生成代码

    using UnityEngine; using UnityEditor; using System.IO; using System; using System.Text; using System ...

  8. oracle 博客精选

    http://mp.sohu.com/profile?xpt=b3JhbmV3c0Bzb2h1LmNvbQ==

  9. 在React组件unmounted之后setState的报错处理

    最近在做项目的时候遇到一个问题,在 react 组件 unmounted 之后 setState 会报错.我们先来看个例子, 重现一下问题: class Welcome extends Compone ...

  10. Volley缓存说明——一个请求两次回调

    从上一篇文章Android 异步网络请求框架-Volley了解volley的一些出来过程,当然也包含网络请求和缓存处理的流程,但是在此需要单独做一些说明. 我在使用过程中忽略了一个事情,就是一个网络请 ...