1、识别浏览器呈现引擎

为了不在全局作用域中添加多余变量,这里使用单例模式(什么是单例模式?)来封装检测脚本。检测脚本的基本代码如下所示:

 var client = function() {
var engine = {
ie: 0,
gecko: 0,
webkit: 0,
khtml: 0,
opera: 0, // 具体的版本号
ver: null
}; return {
engine: engine
}
}();

这里声明了一个名为client的全局变量,用于保存相关信息。匿名函数内部定义了一个局部变量engine,它是一个包含默认设置的对象字面量。在这个对象字面量中,每个呈现引擎都对应着一个属性,属性的默认值是0。如果检测到了哪个呈现引擎,那么就以浮点数值形式将该引擎的版本号写入相应属性。

要识别Opera,必须得检测window.opera对象。Opera5及更高版本中都有这个对象,用于保存与浏览器相关的标识信息以及与浏览器直接交互。在Opera7.6及更高版本中,调用version()方法可以返回一个表示浏览器版本的字符串,而这也是确定Opera版本的最佳方式。要检测更早的Opera,可以直接检测用户代理字符串,因为那些版本还不支持隐藏身份。不过2007底Opera的最高版本已经是9.5了,所以不太可能有人还使用7.6之前的版本。那么,检测呈现引擎的代码的第一步,就是编写如下代码:

     if (window.opera) {
engine.ver = window.opera.version();
engine.opra = parseFloat(engine.ver);
}

接下来检测的引擎是webkit,因为webkit的用户代理字符串中包含“Gecko”和“KHTML”这两个子字符串,所以如果先检测它们,都可能会得出错误的结论。

不过,Webkit的用户代理字符串中的“AppleWebkit”是独一无二的,因此检测这个字符串是最合适的。下面就是检测该字符串的示例代码:

     var ua = navigator.userAgent;
if (window.opera) {
engine.ver = window.opera.version();
engine.opra = parseFloat(engine.ver);
} else if (/AppleWebkit\/(\S+)/i.test(ua)) {
engine.ver = RegExp['$1'];
engine.webkit = parseFloat(engine.ver);
}

接下来要测试的引擎是KHTML。同样,KHTML的用户代理字符串中也包含“Gecko”,因此在排除KHTML之前,我们无法准确检测基于Gecko的浏览器。KHTML的版本号与Webkit的版本号在用户代理字符串中的格式差不多,因此可以使用类似的正则表达式。此外,由于Konquerror 3.1及更早版本中不包含KHTML的版本,故而就要使用Konqueror的版本来代替。下面就是相应的检测代码。

     var ua = navigator.userAgent;
if (window.opera) {
// 检测opera
engine.ver = window.opera.version();
engine.opra = parseFloat(engine.ver);
} else if (/AppleWebkit\/(\S+)/i.test(ua)) {
// 检测webkit
engine.ver = RegExp['$1'];
engine.webkit = parseFloat(engine.ver);
} else if (/KHTML\/(\S+)/i.test(ua) || /Konqueror\/([^;]+)/i.test(ua)) {
// 检测khtml
engine.ver = RegExp['$1'];
engine.khtml = parseFloat(engine.ver);
}

在排除了Webkit和KHTML之后,就可以准确地检测Gecko了。但是,在用户代理字符串中,Gecko的版本号不会出现在字符串“Gecko”的后面,而是会出现在字符串“rv:”的后面。这样,我们就必须使用一个比前面复杂一些的正则表达式,如下所示。

     var ua = navigator.userAgent;
if (window.opera) {
// 检测opera
engine.ver = window.opera.version();
engine.opra = parseFloat(engine.ver);
} else if (/AppleWebkit\/(\S+)/i.test(ua)) {
// 检测webkit
engine.ver = RegExp['$1'];
engine.webkit = parseFloat(engine.ver);
} else if (/KHTML\/(\S+)/i.test(ua) || /Konqueror\/([^;]+)/i.test(ua)) {
// 检测khtml
engine.ver = RegExp['$1'];
engine.khtml = parseFloat(engine.ver);
} else if (/rv:([^\)]+)\) Gecko\/\d{8}/i.test(ua)) {
// 检测gecko
engine.ver = RegExp['$1'];
engine.gecko = parseFloat(engine.ver);
}

最后一个要检测的就是IE了。IE的版本号们于字符串“MSIE”的后面、一个分号的前面,因此相应的正则表达式非常简单,如下所示:

     var ua = navigator.userAgent;
if (window.opera) {
// 检测opera
engine.ver = window.opera.version();
engine.opra = parseFloat(engine.ver);
} else if (/AppleWebkit\/(\S+)/i.test(ua)) {
// 检测webkit
engine.ver = RegExp['$1'];
engine.webkit = parseFloat(engine.ver);
} else if (/KHTML\/(\S+)/i.test(ua) || /Konqueror\/([^;]+)/i.test(ua)) {
// 检测khtml
engine.ver = RegExp['$1'];
engine.khtml = parseFloat(engine.ver);
} else if (/rv:([^\)]+)\) Gecko\/\d{8}/i.test(ua)) {
// 检测gecko
engine.ver = RegExp['$1'];
engine.gecko = parseFloat(engine.ver);
} else if (/MSIE ([^;]+/i.test(ua))/) {
// 检测ie
engine.ver = RegExp['$1'];
engine.ie = parseFloat(engine.ver);
}

2、识别浏览器

大多数情况下,识别了浏览器的呈现引擎就足以为我们采取正确的操作提供依据了。可是,只有呈现引擎还不能说明存在所需的JavaScript功能。苹果公司的Safari浏览器和谷歌公司的Chrome浏览器都使用Webkit引擎,但它们的JavaScript引擎却不一样。在这两款浏览器中,client.webkit都会返回非0值,但仅知道这一点恐怕还不够。对于它们,有必要像下面这样为client对象再添加一些新属性。

 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
};

return {
engine: engine,
browser: browser
}
}();

代码中又添加了browser,用于保存每个主要浏览器的属性。与engine变量一样,除了当前使用的浏览器,其它属性的值将保持为0。如果是当前使用的浏览器,则这个属性中保存的是浮点数值形式的版本号。同样,ver属性中必要时将会包含字符串形式的浏览器完整版本号。由于大多数浏览器与呈现引擎密切相关,所以下面示例中检测浏览器代码与检测呈现引擎的代码是混合在一起的。

 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.opra = browser.opera = parseFloat(engine.ver);
} else if (/AppleWebkit\/(\S+)/i.test(ua)) {
// 检测webkit
engine.ver = RegExp['$1'];
engine.webkit = parseFloat(engine.ver); // 检测Chrome/safari与其对应的版本
if (/Chrome\/(\S+)/i.test(ua)) {
browser.ver = RegExp['$1'];
browser.chrome = parseFloat(browser.ver);
} else if (/Version\/(\S+)/i.test(ua)) {
browser.ver = RegExp['$1'];
browser.safari = parseFloat(browser.ver);
} else {
// 当检测不出Safari版本时,可大致确定safari的版本
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+)/i.test(ua) || /Konqueror\/([^;]+)/i.test(ua)) {
// 检测khtml
engine.ver = browser.ver = RegExp['$1'];
engine.khtml = browser.konq = parseFloat(engine.ver);
} else if (/rv:([^\)]+)\) Gecko\/\d{8}/i.test(ua)) {
// 检测gecko
engine.ver = RegExp['$1'];
engine.gecko = parseFloat(engine.ver); // 确定是不是Firefox
if (/Firefox\/(\S)+/i.test(ua)) {
browser.ver = RegExp['$1'];
browser.firefox = parseFloat(browser.ver);
}
} else if (/MSIE ([^;]+/i.test(ua))/) {
// 检测ie
engine.ver = browser.ver = RegExp['$1'];
engine.ie = browser.ie = parseFloat(engine.ver);
} return {
engine: engine,
browser: browser
}
}();

3、识别浏览器平台——操作系统

很多时候,只要知道呈现引擎足以编写出适当的代码了。但在某些条件下,平台可能是必须关注的问题。那些具有各个平台的浏览器(如Safari、Firefox、Opera)在不同的平台下可能会有不同的问题。目前的三大主流平台是Windows、Mac和Unix(包括各种Linux)。为了检测这些平台,还需要像下面这样添加一个新对象。

 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 system = {
win: false,
mac: false,
xll: false
};

return {
engine: engine,
browser: browser
}
}();

在确定平台时,检测navigator.platform要比检测用户代理字符串更简单,后者在不同浏览器中会给出不同平台的信息。而navigator.platform属性可能的值包括“Win32”、“Win64”、“MacPPC”、“MacIntel”、“Xll”和“Linux i686”,这些值在不同浏览器中都是一致的。检测平台的代码非常直观,如下所示:

     var p = navigator.platform;
system.win = p.indexOf('Win') == 0;
system.mac = p.indexOf('Mac') == 0;
system.xll = (p.indexOf('Xll') == 0 || p.indexOf('Linux') == 0);

4、识别Window操作系统

在Windows下台下,还可以从用户代理字符串中进一步以得具体的操作系统信息。在WIndows XP之前,Windows有两种版本,分别针对家庭版用户和商业用户。针对家庭用户的版本分别是Windows 95、98和Windows ME。而针对商业用户的版本则一直叫做Windows NT,最后由于市场原因改名为Windows 2000。这两个产品后来又合并成一个由Windows NT发展而来的公共的代码基,代表产品就是Winodws XP。随后,微软在Windows XP基础上又构建Windows Vista。

只有了解这些信息,才能搞清楚用户代理字符串中Winodws操作系统具体版本。下表列出了不同浏览器在表示不同Windows操作系统时给出的不同字符串。

windows版本 IE4+ Gecko Opera Webkit
95 “Windows 95” “Win95” “Windows 95” n/a
98 “Winodws 98” “Win98” “Windows 98” n/a
NT 4.0 “Windows NT” “WinNT4.0” “windows NT 4.0” n/a
2000 “Windows NT 5.0” “Windows NT 5.0” “Windows NT 5.0” n/a
ME “Win 9x 4.90” “Win 9x 4.90” “Win 9x 4.90” n/a
XP “Windows NT 5.1” “Windows NT 5.1” “Windows NT 5.1” “Windows NT 5.1”
Vista “Windows NT 6.0” “Windows NT 6.0” “Windows NT 6.0” “Windows NT 6.0”
7 “Windows NT 6.1” “Windows NT 6.1” “Windows NT 6.1” “Windows NT 6.1”
8 “Windows NT 6.2” “Windows NT 6.2” “Windows NT 6.2” “Windows NT 6.2”

由于用户代理字符串中的Windows操作系统版本表示方法各异,因此检测代码并不十分直观。好在,从Windows 2000开始,表示操作系统的字符串大部分都还相同,只有版本号有变化。为了检测不同的Windows操作系统,必须使用正则表达式。

第一步就是匹配Winodws 95和Windows 98这两个字符串。对这两个字符串,只有Gecko与其它浏览器不同,即没有"dows",而且"win"与版本号之间没有空格。要匹配这个模式,可以使用下面这个简单的正则表达式:

 /Win(?:dows )?([^do]{2})/i

这个正则表达式中捕获的数组会返回操作系统的版本。由于版本可能是任何两个字符编码(例如 95、98、9x、NT、ME及XP),因此要使用两个非空空格字符。

Gecko在表示Windows NT时会在末尾添加“4.0”,与其查找实际字符串,不如像现在这样查找小数值更合适。

 /Win(?:dows )?([^do]{2})(\d+\.\d+)?/i

这样,正则表达式中就包含了第二个捕获组,用于取得NT的版本号。由于该版本号对于Windows 95、98而言是不存在的,所以必须设置为可选。这个模式与Opera表示Windows NT的字符串之间唯一的区别,就是“NT”与“4.0”之间的空格,这在模式中很容易添加。

 /Win(?:dows )?([^do]{2})\s+(\d+\.\d+)?/i

经过一番修改后,这个正则表达式也可以成功匹配Windows ME、Windows XP和Windows Vista的字符串了。具体来说,第一个捕获数组将会匹配95、98、9x、NT、ME或XP。第二个捕获数组则只针对Windows ME及所有WIndows NT的变体。这个信息作为具体的操作系统信息保存在system.win属性中,如下所示:

     if (system.win) {
if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/i.test(ua)) {
if (RegExp['$1'] == 'NT') {
switch (RegExp['$2']) {
case '5.0': system.win = '2000'; break;
case '5.1': system.win = 'XP'; break;
case '6.0': system.win = 'Vista'; break;
case '6.1': system.win = '7'; break;
case '6.2': system.win = '8'; break;
default: system.win = 'NT'; break;
}
} else if (RegExp['$1'] == '9x') {
system.win = 'ME';
} else {
system.win = RegExp['$1'];
}
}
}

5、识别移动设备

2006到2007年,移动设备中Web浏览器的应用呈爆炸式增长。四大主要浏览器都推出了手机版和其它设备中运行的版本。要检测相应的设备,第一步是为要检测的所有移动设备添加属性,如下所示:

 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 system = {
win: false,
mac: false,
xll: false, // 移动设备
iphone: false,
ipod: false,
ipad: false,
ios: false,
android: false,
nokiaN: false,
winMobile: false
}; return {
engine: engine,
browser: browser,
system: system
} }();

然后,通过简单地检测字符串“iPhone”、"iPod"和"iPad"就可以分别设置相应属性的值了。

     system.iphone = ua.indexOf('iPhone') > -1;
system.ipod = ua.indexOf('iPod') > -1;
system.ipad = ua.indexOf('iPad') > -1;

除了知道IOS设备,最好还知道IOS的版本号。在IOS之前,用户代理字符串中只包含“CPU like Mac OS”,后来iPhone中又改成“CPU iPhone OS 3_0 like Mac OS X”,iPad又改成“CPU OS 3_2 like Mac OS X”。也就是说,检测IOS需要正则表达式反映这些变化。

     // 检测ios版本
if (system.mac && ua.indexOf('Mobile') > -1) {
if (/CPU (?:iPhone )?OS (\d+_\d+)/i.test(ua)) {
system.ios = parseFloat(RegExp['$1'].replace('_', '.'));
} else {
system.ios = 2; // 不能真正检测出来,所以只能猜测
}
}

检测系统是不是Mac OS、字符串中是否存在“Mobile”,可以保证无论是什么版本,system.ios中都不会是0。然后,再使用正则表达式确定是否存在IOS的版本号。如果有,将system.ios设置为表示版本号的浮点值;否则,将版本号设置为2。(因为没有办法确定到底是什么版本,所以设置为更早的版本比较稳妥)

检测Android版本操作系统也很简单,也就是搜索字符串“Android”并取得紧随其后的版本号。

     // 检测android版本
if (/Android (\d+\.\d+)/i.test(ua)) {
system.android = parseFloat(RegExp['$1']);
}

由于所有的Android都有版本值,因此使用这个正则表达式可以精确的检测所有版本,并将system.android设置为正确的值。

诺基亚N系统手机使用的也是Webkit,其用户代理字符串与其它基于webkit的手机很相似。虽然诺基亚N系列手机在用户代理字符串中声称使用的是“safari”,但实际上并不是safari,尽管确实是基于webkit引擎。只要使用下面检测一下用户代理字符串中是否存在“NokiaN”,就足以确定是不是该系列的手机了。

     // 检测nokia
system.nokiaN = ua.indexOf('NokiaN') > -1;

最后一种主要的移动设备平台是Windows Mobile(也称Windows CE),用于Pocket PC和Smartphone中。由于从技术上说这些平台都属于Windows平台,因此Windows平台和操作系统都会返回正确的值。对于Windows Mobile 5.0及以前的版本,这两种设备的用户代理字符串非常相似,如下所示:

Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)

Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Smartphone; 176x220)

这一个来自Pocket PC中的移动Internet Explorer 4.01,第二个来自Smartphone中的同一个浏览器。当Windows操作系统检测脚本检测到这两个字符串时,system.win将被设置成"CE",因此在检测Windows Mobile时可以使用这个值:

     // 检测Windows Mobile
system.winMobile = (system.win == 'CE');

不建议测试字符串中的“PPC”或“Smartphone”,因为在Windows Mobile 5.0以后版本的浏览器中,这些记号已经被移除了。不过,一般情况下,只知道这某个设备使用的是Windows Mobile也就足够了。

Windows Phone 7的用户代理字符串稍有改进,基本格式如下:

Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6

其中,Windows操作符的标签符与已往完全不同,因此在这个用户代理中,clinet.system.win等于"ph"。从中可以取得有关系统的更多信息:

     // 检测Windows Mobile
if (system.win == 'CE') {
system.winMobile = system.win;
} else if (system.win == 'Ph') {
if (/Windows Phone OS (\d+.\d+)/i.test(ua)) {
system.win = 'Phone';
system.winMobile = parseFloat(RegExp['$1']);
}
}

如果system.win的值是"CE",就说明是老版本的Windows Mobile,因此system.winMobile会被设置为相同的值(只能知道这个信息)。如果system.win的值是“Ph”,那么这个设置就可能是Windows Phone7或更新版本。因此就用正则表达式来测试格式并提取版本号,将system.win的值重置为"Phone",而将system.winMobile设置为版本号。

6、识别游戏系统

除了移动设备之外,视频游戏系统中的Web浏览器也开始日益普及。Wii中的浏览器实际上是定制版的Opera,是专门为Wii Remote设计的。Playstation的浏览器是自己开发的,没有基于前面提到的任何呈现引擎。这两个中的用户代理字符串如下所示:

Opera/9.10 (Nintendo Wii; U; ; 1621; en)

Mozilla/5.0 (PLAYSTATION 3; 2.00)

在检测这些设置以前,我们必须先为client.system中添加适当的属性,如下所示:

 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 system = {
win: false,
mac: false,
xll: false, // 移动设备
iphone: false,
ipod: false,
ipad: false,
ios: false,
android: false,
nokiaN: false,
winMobile: false, // 游戏系统
wii: false,
ps: false
}; return {
engine: engine,
browser: browser,
system: system
} }();

检测前述游戏系统的代码如下:

     // 检测游戏系统
system.wii = ua.indexOf('Wii') > -1;
system.ps = /playstation/i.test(ua);

完整的代码:

     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 system = {
win: false,
mac: false,
xll: false,
iphone: false,
ipoad: false,
ipad: false,
ios: false,
android: false,
nokiaN: false,
winMobile: false,
wii: false,
ps: false
}; 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+)/i.test(ua)) {
engine.ver = RegExp['$1'];
engine.webkit = parseFloat(engine.ver); // 确定是Chrome还是Safari
if (/Chrome\/(\S+)/i.test(ua)) {
browser.ver = RegExp['$1'];
browser.chrome = parseFloat(browser.ver);
} else if (/Version\/(\S+)/i.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.safari = safariVersion;
}
} else if (/KHTML\/(\S+)/i.test(ua) || /Konqueror\/([^;]+)/i.test(ua)) {
engine.ver = browser.ver = RegExp['$1'];
engine.khtml = browser.konq = parseFloat(engine.ver);
} else if (/rv:([^\)]+)\) Gecko\/\d{8}/i.test(ua)) {
engine.ver = RegExp['$1'];
engine.gecko = parseFloat(engine.ver); // 确定是不是Firefox
if (/Firefox\/(\S+)/i.test(ua)) {
engine.ver = browser.ver = RegExp['$1'];
engine.firefox = parseFloat(browser.ver);
}
} else if (/MSIE ([^;]+)/i.test(ua)) {
engine.ver = browser.ver = RegExp['$1'];
engine.ie = browser.ie = parseFloat(engine.ver);
} // 检测平台
var p = navigator.platform;
system.win = p.indexOf('Win') == 0;
system.mac = p.indexOf('Mac') == 0;
system.xll = (p.indexOf('Xll') == 0 || p.indexOf('Linux') == 0); // 检测Windows操作系统
if (system.win) {
if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)) {
if (RegExp['$1'] == 'NT') {
switch(RegExp['$2']) {
case '5.0': system.win = '2000'; break;
case '5.1': system.win = 'XP'; break;
case '6.0': system.win = 'Vista'; break;
case '6.1': system.win = '7'; break;
case '6.2': system.win = '8'; break;
default: system.win = 'NT'; break;
}
} else if (RegExp['$1'] == '9x') {
system.win = 'ME';
} else {
system.win = RegExp['$1'];
}
}
} // 移动设备
system.iphone = ua.indexOf('iPhone') > -1;
system.ipod = ua.indexOf('iPod') > -1;
system.ipad = ua.indexOf('iPad') > -1;
system.nokiaN = ua.indexOf('nokiaN') > -1; // windows mobile
if (system.win == 'CE') {
system.winMobile = system.win;
} else if (system.win == 'Ph') {
if (/Windows Phone OS (\d+.\d)/i.test(ua)) {
system.win = 'Phone';
system.winMobile = parseFloat(RegExp['$1']);
}
} // 检测IOS版本
if (system.mac && ua.indexOf('Mobile') > -1) {
if (/CPU (?:iPhone )?OS (\d+_\d+)/i.test(ua)) {
system.ios = parseFloat(RegExp['$1'].replace('_', '.'));
} else {
system.ios = 2; // 不能真正检测出来,所以只能猜测
}
} // 检测Android版本
if (/Android (\d+\.\d+)/i.test(ua)) {
system.android = parseFloat(RegExp['$1']);
} // 游戏系统
system.wii = ua.indexOf('Wii') > -1;
system.ps = /PlayStation/i.test(ua); return {
engine: engine,
browser: browser,
system: system
}
}();

(注:原文摘自《JavaScript高级程序设计》第3版,第9章 客户端检测,9.3用户代理检测,p221)

userAgent,JS这么屌的用户代理,你造吗?——判断浏览器内核、浏览器、浏览器平台、windows操作系统版本、移动设备、游戏系统的更多相关文章

  1. unigui判断浏览器内核、操作系统以及是否移动终端函数

    function GetDeviceType(var OsName, BrowserName: string; var IsMobileDevice: Boolean): string; var I: ...

  2. PHP JS判断浏览器,微信浏览器

      微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是: Mo ...

  3. js判断是否为手机浏览器

    JS判断手机浏览器 判断原理: JavaScript是前端开发的主要语言,我们可以通过 编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根 ...

  4. js判断是否是ie浏览器且给出ie版本

    之前懒得写判断ie版本js,因为网上关于这方面的代码太多了,所以从网上拷贝了一个,放到项目上才发现由于时效性的问题,代码不生效.就自己写一个吧. 怎么去看浏览器的内核等信息 ---- js的全局对象w ...

  5. 如何通过navigator.userAgent判断是哪款浏览器?

    userAgent 用户代理.通过浏览器控制台alert( navigator.userAgent );可以获得当前浏览器的信息,如果逆推呢? 通过navigator.userAgent判断是哪款浏览 ...

  6. [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器

    截至自2017-08-11,支持现世已出的几乎所有PC端浏览器版本判断. 受支持的PC端浏览器列表: Edge IE Chrome Firefox Opera Safari QQ浏览器 360系列浏览 ...

  7. JS判断客户浏览器是否是IE8浏览器、jQuery判断浏览器内核

    今天在使用encharts的时候由于要兼容IE8,所以最终决定在非IE8浏览器使用encharts,在IE8使用amcharts.于是需要使用JS判断使用的浏览器版本: function IEVers ...

  8. html页面中js判断浏览器是否是IE浏览器及IE浏览器版本

    HTML里: HTML代码中,在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了.在HTML代码中, ...

  9. js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式

    js replace 全局替换   js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ...

随机推荐

  1. java major version(转)

    在jar包中,用winrar解压一个类文件,然后在命令行下面输入 javap -verbose classname 会输出一些信息,大致如下: Compiled from "HtmlCraw ...

  2. SpringMVC源代码深度分析DispatcherServlet核心的控制器(初始化)

    SpringMVC是非常优秀的MVC框架,每一个框架都是为了我们提高开发效率,我们试图通过对SpringMVC的源码去了解这个框架,了解整个设计思想,框架要有扩展性,这里用的比較多是接口和抽象,是框架 ...

  3. 备忘录模式设计模式入门Memento

    //备忘录模式定义: //在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. //这样以后就能够将该对象恢复到原先保存的状态 //实例:測试两种方案.两种方案在第一阶段的过程 ...

  4. 王立平--android特权

    //同意应用程序访问和更改checkin数据库"properties"数据表 android.permission.ACCESS_CHECKIN_PROPERTIES //同意应用 ...

  5. vs2013 ADO联系SQL server2012数据库

    平时,给定ADO例如使用以下过程数据源中的数据的数据库应用程序 (1) 创建一个Connection 物.定义的连接字符串信息.它包含了数据源名称.用户ID.密码.连接超时 . 默认数据库的位置和光标 ...

  6. Jplayer小样

    最近应公司要求需要一个MP3播放的插件,网上找了很多插件,看来看去还是jPlayer用着最舒服也最容易扩展.所以就找了个资料研究了下,简单做了个小DEMO.支持实时控制列表,常见的播放器功能. jPl ...

  7. HDOJ--4821--String【弦hash】

    联系:http://acm.hdu.edu.cn/showproblem.php?pid=4821 题意:给一个字符串,选m个长度为l的子串组成新的串.要求这m个子串互不同样,问有多少种组合. 字符串 ...

  8. DFS PKU 1562

    简单地DFS Oil Deposits Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12801   Accepted: 6 ...

  9. 怎样在多线程中使用JNI?

    假设你想了解JNI在怎样在多线程下使用 假设你在子线程使用JNI时遇到findClass不能找到目标Class,而在主线程下却能找到该Class的问题.或是GetEnv返回NULL的问题 假设你想多学 ...

  10. JavaScript总结一下--创建对象

          在JavaScript象主要就是用下面三种语句: var box=new Object(); 或var box=Object(); var box={};//字面量 function Bo ...