`
zhouyrt
  • 浏览: 1141682 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

有趣的浏览器检测

阅读更多

在写跨浏览器的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;
 

最经典的莫过于 !-[1,] 的判断方式,目前最少代码判断IE的方式,只需6个byte。这是个俄国人 发现的。利用了数组[1,]的length。还有来自英国的年轻 James Padolsey 利用IE条件注释

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测试的)

 

 

 

分享到:
评论
15 楼 madsion8875 2010-10-13  
不错,thanks
14 楼 jimoshutong 2010-08-27  
个人感觉这些方法都或多或少有点小问题,有没有一种很好的方法呢,能写一个通用的检测方法。
13 楼 jundy 2010-03-06  
还是用常规的比较好,最简洁的不一定是最好的
12 楼 s海若 2010-03-03  
第三种方法确实让人眼前一亮,是非常俏皮的技巧。
但是效果正如CSS hack,还是少用的好。
11 楼 s海若 2010-03-03  
rainsilence 写道

var ua = navigator.userAgent.toLowerCase(),
    check = function(r){
            return r.test(ua);
    },
    isOpera = check(/opera/),
    isChrome = check(/\bchrome\b/),
    isWebKit = check(/webkit/),
    isSafari = !isChrome && check(/safari/),
    isSafari2 = isSafari && check(/applewebkit\/4/),
    isSafari3 = isSafari && check(/version\/3/),
    isSafari4 = isSafari && check(/version\/4/),
    isIE = !isOpera && check(/msie/),
    isIE7 = isIE && check(/msie 7/),
    isIE8 = isIE && check(/msie 8/),
    isIE6 = isIE && !isIE7 && !isIE8,
    isGecko = !isWebKit && check(/gecko/),
    isGecko2 = isGecko && check(/rv:1\.8/),
    isGecko3 = isGecko && check(/rv:1\.9/),
    isBorderBox = isIE && !isStrict,
    isWindows = check(/windows|win32/),
    isMac = check(/macintosh|mac os x/),
    isAir = check(/adobeair/),
    isLinux = check(/linux/)

简洁,简单

Ext 的UA嗅探确实简洁明了。特性检测肯定是最无敌的招数。但是结果就是代码里充斥着各种If, Else.值不值得呢?是个问题。
10 楼 yvonxiao 2010-03-02  
某些情况下还是要特性判断结合下userAgent,像要统计客户端浏览器的具体的种类(比如那些用了ie内核的浏览器比如傲游或者360之类)的时候,就只好从userAgent里找关键字了
9 楼 Amar 2010-03-02  
学习一下。
8 楼 rainchen 2010-03-02  
userAgent 探测有个问题是,如果用户用userAgent的工具更改的话,探测结果会被误导。

这种情况用特性判断比较好,不管userAgent怎么变,浏览器的本质都是不变的
7 楼 yuyue618 2010-03-02  
jquery都已经舍去这种检查方法. 改用特性检测.
6 楼 rainsilence 2010-03-01  

var ua = navigator.userAgent.toLowerCase(),
    check = function(r){
            return r.test(ua);
    },
    isOpera = check(/opera/),
    isChrome = check(/\bchrome\b/),
    isWebKit = check(/webkit/),
    isSafari = !isChrome && check(/safari/),
    isSafari2 = isSafari && check(/applewebkit\/4/),
    isSafari3 = isSafari && check(/version\/3/),
    isSafari4 = isSafari && check(/version\/4/),
    isIE = !isOpera && check(/msie/),
    isIE7 = isIE && check(/msie 7/),
    isIE8 = isIE && check(/msie 8/),
    isIE6 = isIE && !isIE7 && !isIE8,
    isGecko = !isWebKit && check(/gecko/),
    isGecko2 = isGecko && check(/rv:1\.8/),
    isGecko3 = isGecko && check(/rv:1\.9/),
    isBorderBox = isIE && !isStrict,
    isWindows = check(/windows|win32/),
    isMac = check(/macintosh|mac os x/),
    isAir = check(/adobeair/),
    isLinux = check(/linux/)

简洁,简单
5 楼 EldonReturn 2010-03-01  
如果想自己做个库啥的
还是进行嗅探后,统一到一个逻辑document对象上在调用比较方便吧
4 楼 aoliwen521 2010-03-01  
咋一看,没看懂。有空慢慢研究。
3 楼 Army 2010-03-01  
如果要判断浏览器,推荐做法是UA嗅探。

如果是在使用某一特性之前的检测,推荐做法是特性检测。

最后,特性检测并非浏览器检测。
2 楼 xinyu198736 2010-02-26  
lz,提醒一下,user-agent检测的ie版本不准确,经常出错
1 楼 cloudgamer 2010-02-26  
我的工具库里是这样检测的:
    var b = {
        msie: /msie/.test(ua) && !/opera/.test(ua),
        opera: /opera/.test(ua),
        safari: /webkit/.test(ua) && !/chrome/.test(ua),
        firefox: /firefox/.test(ua),
        chrome: /chrome/.test(ua)
    };
    var vMark = "";
    for (var i in b) {
        if (b[i]) { vMark = "safari" == i ? "version" : i; break; }
    }
    b.version = vMark && RegExp("(?:" + vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";

相关推荐

    有趣的浏览器地址栏JS代码

    这段代码首先检测浏览器是否为Internet Explorer(IE),并检查其字符集编码。根据不同的情况加载相应的脚本资源,通常用于兼容性处理或根据不同浏览器特性加载特定的脚本库,例如在此案例中可能是为了加载搜狗拼音...

    对各个浏览器做了一个测试,发现了一有趣的现象

    标题中的“对各个浏览器做了一个测试,发现了一有趣的现象”暗示了这可能是一个关于浏览器兼容性或特性测试的探讨。由于描述中没有提供具体信息,我们可以根据常见的浏览器测试经验来进行扩展。 在Web开发中,浏览器...

    环宇浏览器星际版

    “寰宇浏览器星际版”可能内置了恶意软件检测、广告拦截和隐私保护机制,保护用户免受网络威胁。 4. **智能搜索**:智能搜索引擎能够理解用户的查询意图,提供准确的搜索结果。可能支持语音搜索和预测性输入,提高...

    JavaScript判断浏览器类型的方法

    在实际开发过程中,可以通过编写一个通用的函数来封装浏览器检测的逻辑,以便在需要判断浏览器类型的地方直接调用。这样的函数可以接受一个回调函数作为参数,根据不同浏览器的类型执行不同的逻辑。这样的设计不仅能...

    boomJS, JavaScript实现一个有趣的浏览器图片爆炸动画效果.zip

    在“boomJS”项目中,我们看到了一个利用JavaScript实现的有趣图片爆炸动画效果。这个效果能够将一张图片在浏览器中分解成多个小块,然后这些小块以动态的方式散开,形成一种视觉上的“爆炸”效果。这种技术通常被...

    webscan:基于浏览器的网络扫描仪和本地IP检测

    网络扫描是基于浏览器的网络IP扫描程序和本地IP检测器。 它通过WebRTC侦听RTP数据通道并通过任何实时IP循环回到端口,并通过监视即时超时来发现有效子网中的所有实时IP地址,从而检测绑定到用户/受害者的IP(返回TCP...

    Android中轴旋转特效实现,制作别样的图片浏览器

    在Android开发中,创建独特的用户体验往往需要...这不仅可以提升应用的趣味性,还能增加用户的交互深度,让图片浏览变得更加生动有趣。而实现这一效果的关键在于理解和巧妙地结合手势检测、3D变换以及视图的重绘机制。

    Kittydar用JavaScript编写的猫脸检测程序

    - **实时检测**:在网页上,用户上传图片后,Kittydar会在浏览器中实时运行模型,标记出检测到的猫脸位置。 4. **Kittydar项目结构** "CatFaceDetect-master"这个文件夹很可能包含了项目的源代码、训练数据、示例...

    Python-在esp8266上面开发一款chrome浏览器离线时可玩的那款恐龙跳仙人掌的游戏

    在ESP8266上开发基于Python的Chrome离线恐龙游戏是一个有趣且具有挑战性的项目。ESP8266是一款低成本、高性能的Wi-Fi微控制器,它可以作为一个小型服务器,为本地设备提供网络服务。这个项目的目标是将谷歌Chrome...

    网络游戏-基于Kinect的操纵网络浏览器的系统及方法.zip

    此外,为了确保精确性和用户体验,系统还需要具备一定的错误检测和修正机制,以避免误解用户的动作。 在实际应用中,这样的系统可以广泛应用于多种场景。对于游戏领域,它增加了游戏的沉浸感和互动性,玩家不再只是...

    js判断当前浏览器类型,判断IE浏览器方法

    为了更稳定地检测浏览器,可以考虑使用特性检测(feature detection)和现代库,如`Modernizr`,它能更准确地识别浏览器对HTML5和CSS3新特性的支持情况。 总的来说,虽然JavaScript提供了一种简单的方法来大致判断...

    使用CIFAR10数据集在浏览器训卷积神经网络

    总结来说,使用CIFAR-10数据集和TensorFlow.js在浏览器中训练CNN是一项有趣且实用的技术,它允许开发者创建交互式应用,让用户可以直接在网页上体验深度学习模型的运行。这种技术的潜力在于它能够将机器学习带到更...

    matter.js实现的浏览器崩溃元素掉落动画效果源码.zip

    在这个项目中,`matter.js`被巧妙地应用来创建了一个生动有趣的元素掉落动画,模拟了浏览器窗口因故障而崩塌的场景。 `matter.js`库的核心特性包括: 1. **物理引擎**:`matter.js`内置了一个高效的物理引擎,能够...

    JavaScriptWebGL库来检测和复制面部表情

    总之,JavaScript WebGL库“JeelizWeboji”为Web开发者提供了一个强大而有趣的工具,让创建具有互动性和个性化的表情动画变得触手可及。结合现代Web技术,你可以在各种应用场景中实现类似Apple Animoji的功能,提升...

    phaser:适用于桌面和移动网络浏览器的快速,免费,有趣HTML5游戏框架

    它提供了一套完整的工具集,包括精灵、精灵表、动画、物理引擎、碰撞检测、定时器和声音管理等,极大地简化了游戏开发流程。 1. **HTML5与Canvas** HTML5是超文本标记语言的最新版本,它引入了许多新特性,其中...

    Java Swing实现仿Chrome浏览器跳跳龙小游戏.zip

    在这个特定的项目"Java Swing实现仿Chrome浏览器跳跳龙小游戏"中,开发者利用Java Swing来创建了一个类似Chrome浏览器上的经典小游戏——跳跳龙。这个游戏通常是一个简单的平台跳跃游戏,玩家需要控制一个小角色在...

    基于jQuery非常强大的TN3相册代码,切换效果优美,有多种皮肤可选。兼容主流浏览器.rar

    - 为了适应移动设备,可能还采用了响应式设计,利用jQuery的`.width()`等方法检测屏幕尺寸,自动调整布局和切换效果。 4. **互动性和用户体验** - jQuery的事件处理能力使得TN3相册可以响应用户的点击、滚动等...

    输入密码时检测大写是否锁定的js代码.docx

    ### 输入密码时检测大写是否锁定的JS代码详解 #### 一、背景介绍 在现代Web应用中,用户体验是至关重要的一个方面。特别是在涉及到账户...未来随着前端技术的发展,还可以探索更多有趣的方法来进一步优化这一功能。

    narration.studio:使用语音识别功能自动进行浏览器内有声书的编辑

    自动-语音识别API会检测每个句子的开头和结尾,使您可以暂停说话,谈论其他事情并重读上一行。 错误将为您消除。 包括电池-支持纯文本,CommonMark和GFM。 没有设置,没有帐户,完全在浏览器中。 高性能-使用...

    face-detection:使用Tracking.js进行实时人脸检测

    而且所有这些都在浏览器中同时具有轻量级据黑客宣布tracking.js的新闻线程说,它的实现基于Viola-Jones算法,该算法是解决“人脸检测问题”的最常用算法之一。 有趣的是,OpenCV也使用此算法,它允许您仅通过更改...

Global site tag (gtag.js) - Google Analytics