使用js检测浏览器的实现代码

 更新时间:2013年05月14日 16:06:40   投稿:jingxian  
本篇文章是对使用js检测浏览器的实现代码进行了详细的分析介绍,需要的朋友参考下

在写跨浏览器的js程序中,检测浏览器是一个很重要的工作。我们不时要为不同的浏览器写分支代码。
如下是一种:

复制代码 代码如下:

//添加事件工具函数
function addEvent(el,type,handle){
    if(el.addEventListener){//for standard browses
        el.addEventListener(type,handle,false);
    }else if(el.attachEvent){//for IE
        el.attachEvent("on"+event,handle);
    }else{//other
        el["on"+type]=handle;
    }

}


1,第一种检测浏览器方式称为 user-agent 检测方式。是最古老的,它检测目标浏览器的确切型号,包括浏览器的名称和版本。其实就是一个字符串,用navigator.userAgen或navigator.appName获取。如下:
复制代码 代码如下:

function isIE(){
    return navigator.appName.indexOf("Microsoft Internet Explorer")!=-1 && document.all;
}
function isIE6() {
    return navigator.userAgent.split(";")[1].toLowerCase().indexOf("msie 6.0")=="-1"?false:true;
}
function isIE7(){
    return navigator.userAgent.split(";")[1].toLowerCase().indexOf("msie 7.0")=="-1"?false:true;
}
function isIE8(){
    return navigator.userAgent.split(";")[1].toLowerCase().indexOf("msie 8.0")=="-1"?false:true;
}
function isNN(){
    return navigator.userAgent.indexOf("Netscape")!=-1;
}
function isOpera(){
    return navigator.appName.indexOf("Opera")!=-1;
}
function isFF(){
    return navigator.userAgent.indexOf("Firefox")!=-1;
}
function isChrome(){
    return navigator.userAgent.indexOf("Chrome") > -1; 
}

2,第二种称为 对象/特征 检测方式,这是一种判断浏览器能力的方式,也是目前流行的方式。即在使用一个对象之前检测它是否存在。上面提到的addEvent方法中就使用了该方式。.addEventListener是w3c dom标准方式,而IE使用自己特有attachEvent。以下列举几个:

a,talbe.cells只有IE/Opera支持。

b,innerText/insertAdjacentHTML除Firefox外,IE6/7/8/Safari/Chrome/Opera都支持。

c,window.external.AddFavorite用来在IE下添加到收藏夹。

d,window.sidebar.addPanel用来在FF下添加到收藏夹。


3,第三种很有趣,暂且称为 浏览器缺陷或bug 方式,即某些表现不是浏览器厂商刻意实现的。如下:

复制代码 代码如下:

var isIE = !+"\v1";
var isIE = !-[1,];
var isIE = "\v"=="v";
isSafari=/a/.__proto__=='//';
isOpera=!!window.opera;

复制代码 代码如下:

var ie = (function(){
    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');
 
    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );
    return v > 4 ? v : undef
}());

被称为史上最有创意的IE判断。

注1:isIE = "\v" == "v" 方式IE9已经修复该bug,不能用此方式判断IE浏览器了(2010-6-29用IE9 pre3测试的)

相关文章

  • js setTimeout opener的用法示例详解

    js setTimeout opener的用法示例详解

    opener: 指parent表示父窗口,比如一个A页面利用iframe或frame调用B页面,那么A页面所在窗口就是B页面的parent,下面为大家介绍下其详细的使用方法,感兴趣的朋友可以参考下
    2013-10-10
  • 基于JavaScript 类的使用详解

    基于JavaScript 类的使用详解

    JavaScript里的Class(类),其实是通过Function来实现的。 我们通过字面量或者构造函数来创建对象时,其实都只是给特定的一个对象赋属性和值。如果我们有多个对象,他们的属性都一样只是值不同,那就会写很多重复的语句,这时候类就很好用了
    2013-05-05
  • 从数据结构分析看:用for each...in 比 for...in 要快些

    从数据结构分析看:用for each...in 比 for...in 要快些

    本篇文章小编将为大家介绍,从数据结构分析看:用for each...in 比 for...in 要快些。需要的朋友可以参考一下
    2013-04-04
  • Javascript入门学习资料收集整理篇

    Javascript入门学习资料收集整理篇

    为大家更好的接触和学习js资料,所以我转了这篇文章,我大约的看了下,文章写的非常不错,希望大家不要急,慢慢看,第一次看不懂不要紧,多练习就可以了
    2008-07-07
  • JavaScript内核之基本概念

    JavaScript内核之基本概念

    本文将聚焦于JavaScript中的基本概念,这些概念与传统语言有比较大的不同,因此单独列出一章来做专门描述,理解本章的概念对书中后续章节的概念,代码的行为等会有很大的帮助,读者不妨花比较大的时间在本章,即使你对JavaScript已经比较熟悉,也建议通读本文
    2011-10-10
  • 你真的了解JavaScript吗?

    你真的了解JavaScript吗?

    你真的了解JavaScript吗?...
    2007-02-02
  • nodejs中exports与module.exports的区别详细介绍

    nodejs中exports与module.exports的区别详细介绍

    你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下
    2013-01-01
  • JavaScript For 循环

    JavaScript For 循环

    JavaScript For 循环...
    2007-04-04
  • javascript的push使用指南

    javascript的push使用指南

    这篇文章主要介绍了javascript的push使用指南,需要的朋友可以参考下
    2014-12-12
  • 个人总结的一些关于String、Function、Array的属性和用法

    个人总结的一些关于String、Function、Array的属性和用法

    个人总结的一些关于String、Function、Array的属性和用法...
    2007-01-01

最新评论