JavaScript编写检测用户所使用的浏览器的代码示例

作者:小渝人儿 时间:2024-11-21 01:03:15 

能力检测
在编写代码之前先检测特定浏览器的能力。例如,脚本在调用某个函数之前,可能要先检测该函数首付存在。这种检测方法将开发人员从考虑具体的浏览器类型和版本中解放出来,让他们把注意力集中到相应的能力是否存在上。能力检测无法精确地检测特定的浏览器和版本。

怪癖检测
怪癖实际上是浏览器实现中存在的bug,例如早期的webkit中就存在一个怪癖,即它会再for-in循环中返回被隐藏的属性。怪癖检测通常涉及到运行一段代码,然后确定浏览器是否存在某个怪癖。由于怪癖检测无法精确地检测特定的浏览器和版本。

用户代理检测
通过检测用户代理字符串来识别浏览器。用户代理字符串中包含大量与浏览器有关的信息,包括浏览器、平台、操作系统及浏览器版本。用户代理字符串有过一段相当长的发展历史,在此期间,浏览器提供商视图通过在用户代理字符串总添加一些欺骗性信息,欺骗网站详细自己的浏览器是另外一种浏览器。用户代理检测需要特殊的技巧,特别是要注意Opera会隐瞒其用户代理字符串的情况。即便如此,通过用户代理字符串仍然能够检测出浏览器所用的呈现引擎以及所在的平台,包括移动设备和游戏系统。

在每一次HTTP请求过程中,用户代理字符串是作为响应首部发送的,而且该字符串可以通过Javascript的navigator.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) {
 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(engine.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.kong = 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);

}

// 检测浏览器
browser.ie = engine.ie;
browser.opera = engine.opera;

// 返回这些对象
return {
 engine:engine,
 browser: browser
}
}();

console.log(client.engine);
console.log(client.browser);

Tangram 检测浏览器源码


/**
* 声明baidu包
*/
var baidu = baidu || {version: "1-3-2"}; // meizz 20100513 将 guid 升级成 \x06
baidu.guid = "$BAIDU$";//提出guid,防止修改window[undefined] 20100504 berg

/**
* meizz 2010/02/04
* 顶级域名 baidu 有可能被闭包劫持,而需要页面级唯一信息时需要用到下面这个对象
*/

window[baidu.guid] = window[baidu.guid] || {};

/**
* 声明baidu.browser包
*/
baidu.browser = baidu.browser || {};

/**
* 判断是否为isGecko
*/
baidu.browser.isGecko = /gecko/i.test(navigator.userAgent) && !/like gecko/i.test(navigator.userAgent);

/**
* 判断是否为isWebkit
*/
baidu.browser.isWebkit = /webkit/i.test(navigator.userAgent);

/**
* 判断是否为标准模式
*/
baidu.browser.isStrict = document.compatMode == "CSS1Compat";

/**
* 判断是否为safari浏览器
*/
if ((/(\d+\.\d)(\.\d)?\s+safari/i.test(navigator.userAgent) && !/chrome/i.test(navigator.userAgent))) {
baidu.browser.safari = parseFloat(RegExp['\x241']);
}

/**
* 判断是否为opera浏览器
*/
if (/opera\/(\d+\.\d)/i.test(navigator.userAgent)) {
baidu.browser.opera = parseFloat(RegExp['\x241']);
}

/**
* 判断是否为chrome浏览器
*/
if (/chrome\/(\d+\.\d)/i.test(navigator.userAgent)) {
baidu.browser.chrome = parseFloat(RegExp['\x241']);
}

/**
* 判断是否为ie浏览器
*/
if (/msie (\d+\.\d)/i.test(navigator.userAgent)) {
baidu.ie = baidu.browser.ie = document.documentMode || parseFloat(RegExp['\x241']);
}

/**
* 判断是否为firefox浏览器
*/
if (/firefox\/(\d+\.\d)/i.test(navigator.userAgent)) {
baidu.browser.firefox = parseFloat(RegExp['\x241']);
// '\x241' 是八进制表示法 '\x24' 对应字符 '$' ,所以 '\x241' 等同于 '$1'
}
标签:avaScript,检测,浏览器
0
投稿

猜你喜欢

  • Python实现学生管理系统并生成exe可执行文件详解流程

    2023-03-11 04:52:42
  • MySql获取某个字段存在于哪个表的sql语句

    2024-01-18 23:12:11
  • Python基于爬虫实现全网搜索并下载音乐

    2023-12-26 16:36:40
  • 将Python文件打包成.EXE可执行文件的方法

    2023-05-26 20:25:50
  • Symfony控制层深入详解

    2023-11-14 20:43:33
  • python实现在函数中修改变量值的方法

    2023-12-15 04:15:02
  • Python 实现Serial 与STM32J进行串口通讯

    2021-03-05 16:01:33
  • 解决SQL Server的“此数据库没有有效所有者”问题

    2011-12-14 18:29:35
  • 详解微信小程序中的页面代码中的模板的封装

    2024-04-29 13:40:35
  • 从trim原型函数看js正则表达式的性能

    2008-12-11 13:55:00
  • 详解django中自定义标签和过滤器

    2021-02-16 19:43:38
  • Go语言算法之寻找数组第二大元素的方法

    2023-06-24 16:19:03
  • 浅析JSONP技术原理及实现

    2024-05-28 15:41:10
  • 基于Python创建可定制的HTTP服务器

    2023-08-09 22:46:09
  • python抖音表白程序源代码

    2021-01-29 17:12:38
  • 如何在golang中使用shopspring/decimal来处理精度问题

    2024-05-21 10:24:12
  • mysql5.58的编译安装

    2011-01-29 16:26:00
  • MySQL数据库性能优化之索引优化

    2012-05-08 07:16:37
  • mysql如何查询日期与时间

    2024-01-26 02:03:17
  • python 集合 并集、交集 Series list set 转换的实例

    2023-12-16 10:53:34
  • asp之家 网络编程 m.aspxhome.com