javascript客户端检测.doc_第1页
javascript客户端检测.doc_第2页
javascript客户端检测.doc_第3页
javascript客户端检测.doc_第4页
javascript客户端检测.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

客户端检测核心代码完整代码:参见 【用户代理完整代码】 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, andriod: false, nokiaN: false, winMobile: false, /游戏系统 wii: false, ps: false ; /检测呈现引擎和浏览器 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); if (/Chrome/($+)/.test(ua) /确定是Chrome还是safari browser.ver = RegExp$1; browser.chrome = parseFloat(browser.ver); else if (/Version/($+)/.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 -1; system.ipod = ua.indexOf(ipod) -1; system.ipad = ua.indexOf(ipad) -1; system.nokiaN = ua.indexOf(nokiaN) -1; /window mobile if (system.win = CE) system.winMobile = system.win; else if (system.win = Ph) if (/Windows Phone OS (d+.d+)/.test(ua) system.win = Phone; system.winMobile = parseFloat(RegExp$1); /检测IOS版本 if (system.mac & ua.indexOf(Mobile) -1) if (/CPU(?:iphone)?OS(d+_d+)/.test(ua) system.ios = parseFloat(RegExp.$1.replace(_, -); else system.ios = 2;/不能真正检测出来,所以只能猜! /检测Android版本 if (/Android(d+.d+) /.test(ua) system.andriod = parseFloat(RegExp$1); /游戏系统 system.wii = ua.indexOf(wii) -1; system.ps = /playstation/.test(ua); return engine: engine, browser: browser, system: system ; ;测试结果:暂时测试成功!总结:这个是一种对象的写法调用的时候, var userClient= new client();一、能力监测1.能力监测代码:检测通过function getElement(id) if (document.getElementById) alert(byID); return document.getElementById(id); else if (document.all) alert(ALL); return document.allid; else throw new Error(No way to retrieve element!); 注释:IE5.0之前的版本不支持 document.getElementById() 这个DOM 方法,尽管可以使用 document.all 属性 实现相同的目的,不过不过IE 的早期版本中确实不存在 document.getElementById().测试结果:IE6,IE7中document.getElementById(“”).clientWidth; clientHeight 返回来的值都是0!2. 更可靠的能力检测1)检测某个属性师存在并不能确定对象是否支持排序, 更好的办法是检测sort是不是一个函数。例如:function isSortable(object) return typeof(object.sort = function);2) 大多数浏览器在检测到 document.createElement()存在的时候,typeof(document.createElement()都会返回 true;IE8及之前版本中typeof(document.createElement() 返回的是object!解释:IE及更早版本中的宿主对象是通过COM而非 JScript实现的。因此 document.createElement()函数确实是一个COM对象,所以typeof才返回“object”! IE9纠正了这个问题,对所有的DOM方法 都返回“function”!3) 使用ActiveX对象(只有IE支持)与其他对象的行为差异很大。var xhr = new ActiveXObject(Microsoft XMLHttp); if (xhr.open) /这里会发生错误 /执行操作 Error:SCRIPT429: Automation 服务器不能创建对象 解释:像这样直接把函数作为属性 访问 会导致 JavaScript错误。使用typeof操作符会更靠谱一点,不过IE对 typeof xhr.open 会返回 “unknown”.所以,在浏览器环境下 测试如何对象的摸个特性是否存在,要使用下面这个函数:var xhr = new ActiveXObject(Microsoft XMLHttp); /作者:Peter Michaux function isHostMethod(object, property) var t = typeof (objectproperty); if (t = unknown) alert(unknown); return (t = function | (!(t = object & objectproperty) | t = unknown); result = isHostMethod(xhr, open);/true result = isHostMethod(xhr, foo);/false还是错误: Automation 服务器不能创建对象, 一开始就错误了!错误地址:var xhr = new ActiveXObject(Microsoft XMLHttp);4)/确定浏览器是否支持Netscape风格的插件var hasNSPlugins = !(navigator.plugins & navigator.plugins.length);alert(hasNSPlugins);5)确定浏览器是否具有DOM1级规定的能力var hasDOM1 = !(document.getElementById & document.createElement & document.getElementsByTagName);alert(hasDOM1);注意:书本这里使用 双逻辑非 操作的来的布尔值(比先存储后访问的效果更好)。我不清楚这是为啥!2、 怪癖检测怪癖检测(quirks detection); 怪癖,也就是bug。代码:var hasDontEnumQuirk = function () var o = toString: function () ; for(var prop in o) if (prop=toString) return false; return true; ();原创:上面通过一个匿名函数来测试该“怪癖”,函数中创建一个带有toString()方法的对象。1.在正确的ECMAScript实现中,toString 应该在for-in 循环中作为属性返回。 2.IE8以及更早的版本中存在一个BUG,即如果某个实例属性与Enumerable标记为false 的某个原型属性同名,那么该属性将不会出现在for-in 循环当中!测试结果:无论在IE6,IE7,IE8,Firefox, Chrome中 这个匿名函数hasDontEnumQuirk,都是返回 false! 这里有歧义, 因为在很多浏览器下面都一致的结果 ,就不能算BUG!代码二:var hasDontEnumQuirk = function () var o = toString: function () ; var count = 0; for (var prop in o) if (prop=toString) count+; return (count1); ();原创:“怪癖”是 Safari 3 以前版本会枚举被隐藏的属性。以上代码在 Safari 3中,for-in 循环枚举带有自定义的toString()方法对象,就会返回两个 toString的实例,也就是 count=2测试结果: 没有遇到 count 的数值为2的情况!拓展代码var hasDontEnumQuirk = function () var o = sayHello: function () , toString: function () ; alert(typeof (o.sayHello);/返回的是 function var count = 0; for (var prop in o) alert(typeof (prop)/返回的全是string if (prop = toString) count+; return (count 1); ();3、 用户代理检测1.相关术语:1).“电子欺骗”:就是在浏览器通过在自己的用户代理字符串中假如一些错误的或误导性信息,来达到欺骗服务器的目的。2).HTTP规范,明确规定 浏览器应该发送简短的用户代理字符串,指明浏览器的名称和版本号。2.浏览器历史1).早期浏览器世界第一款web浏览器:Mosaic(美国NCSA 国家超级计算机中心发布)用户代理字符串:Mosaic/0.9Netscape Communications 公司发布Mozilla( 意为:Mosaic 杀手) 发布,Mozilla用户代理格式:Mozilla/版本号 语言 (平台; 加密类型) 语言:语言代码。平台:操作系统,或者 运行环境。加密类型:即安全加密类型。 U:128位加密、I:40位加密 和N:位加密。结果:Mozilla/2.02 fr (WinNT; I)2) Netscape Navigator 3和 Internet Explorer 3Netscape Navigator 3户代理格式:Mozilla/版本号(平台;加密类型; 操作系统CUP说明)结果:Mozilla/3.0 (Win95;U)Internet Explorer 3在win95平台下用户代理格式:Mozilla/2.0(compatible; MSIE 版本号; 操作系统)结果:Mozilla/2.0(compatible; MSIE 3.02; widnows 95)3) Netscape Communicator 4和 IE4-IE8Netscape Communicator 4用户代理格式:Mozilla/版本号 (平台; 加密类型 ; 操作系统CUP说明)结果: Mozilla /4.0 (Win98; I);Mozilla /4.79 (Win98; I);Internet Explorer4-Internet Explorer7用户代理格式: Mozilla/4.0(compatible; MSIE 版本号; 操作系统)结果:Mozilla/4.0(compatible; MSIE 4.0; Wiindows 98)Mozilla/4.0(compatible; MSIE 4.5; Wiindows 98)【注释:这个版本的IE只针对Macs】Mozilla/4.0(compatible; MSIE 7.0; Wiindows 98)IE8用户代理字符串添加了呈现引擎(Trident)的版本号用户代理格式: Mozilla/4.0(compatible; MSIE 版本号; 操作系统; Trident/Trident 版本号)结果:Mozilla/4.0(compatible; MSIE 8.0; Wiindows NT 5.1; Trident/4.0)【注释:这个Trident记号是为了让开发人员知道IE8是不是在兼容模式下运行。如果是MSIE版本号就会变成7,但Trident及版本号还会留在用户代码字符串中。】Mozilla/4.0(compatible; MSIE 7.0; Wiindows NT 5.1; Trident/4.0)IE9用户代理做了一些调整,Mozilla的版本号升级到5.0,Trident版本号升级到5.0.Mozilla/5.0(compatible; MSIE 9.0; Wiindows NT 6.1; Trident/5.0)IE9运行在IE7兼容模式下的用户代理字符串:Mozilla/4.0(compatible; MSIE 7.0; Wiindows NT 6.1; Trident/5.0)4) Gecko注释:Geckos 是Firefox的呈现引擎。第一个采用Gecko引擎的浏览器是Netscape6。用户代理字符串的构成:Mozilla/Mozilla 版本号(平台;加密类型; 操作系统或CPU;语言; 预先发行版本 Gecko/Gecko版本号 应用程序或产品/应用程序或产品)字符串项必需吗说明Mozilla版本号是Mozilla版本号平台是浏览器运行的平台。可能的值包括windows、Mac和X11(指Unix的X窗口系统)加密类型是加密技术的类型:U表示 128位、I表示40位、N表示未加密操作系统或CPU是浏览器运行的操作系统或计算机系统使用的CPU。语言是浏览器设计时所针对的目标用户语言预先发行版本否浏览器设计时所针对的目标用户语言Gecko版本号是Gecko呈现的版本号,但由yyymmdd格式的日期表示应用程序或产品否使用Gecko产品名。可能是Netscape、Firefox等应用程序或产品版本号否应用程序或产品版本号;用于区分Mozilla版本号和Gecko版本号WindowsXP下的Netscape6.2.1Mozilla/5.0(Windows; U; Windows

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论