一、检测

用于用户代理检测,检测范围包括浏览器引擎、平台、Windows、移动设备和游戏系统等

  1. /*
  2. *用户代理检测脚本,检测范围包括浏览器引擎、平台、Windows、移动设备和游戏系统
  3. */
  4. var client = function()
  5. {
  6. //呈现引擎
  7. var engine = {
  8. ie:0, //ie
  9. gecko:0, //火狐
  10. webkit:0, //chrome和safari
  11. khtml:0, //Linux下的Konqueror
  12. opera:0, //opera
  13. ver:null //完整版本号
  14. };
  15.  
  16. //浏览器
  17. var browser = {
  18. ie:0,
  19. firefox:0,
  20. safari:0,
  21. konq:0,
  22. opera:0,
  23. chrome:0,
  24. ver:null //具体版本号
  25. };
  26.  
  27. //平台、设备和操作系统
  28. var system = {
  29. //操作系统
  30. win:false,
  31. mac:false,
  32. xll:false, //UNIX
  33.  
  34. //移动设备
  35. iphone:false,
  36. ipod:false,
  37. ipad:false,
  38. ios:false,
  39. android:false,
  40. nokiaN:false, //诺基亚
  41. winMobile:false, //windows mobile
  42.  
  43. //游戏系统
  44. wii:false, //Wii
  45. ps:false //Playstation 3
  46. };
  47.  
  48. //检测呈现引擎和浏览器
  49. var ua = navigator.userAgent;
  50. if(window.opera)
  51. {
  52. engine.ver = browser.ver = window.opera.version();
  53. engine.opera = browser.opera = parseFloat(engine.ver);
  54. }
  55. else if(/AppleWebkit\/(\S+)/.test(ua ))
  56. {
  57. engine.ver = RegExp["$1"];
  58. engine.webkit = parseFloat(engine.ver);
  59.  
  60. //确定是chrome还是safari
  61. if(/Chrome\/(\S+)/.test(ua))
  62. {
  63. browser.ver = RegExp["$1"];
  64. browser.chrome = parseFloat(browser.ver);
  65. }
  66. else if(/Version\/(\S+)/.test(ua))
  67. {
  68. browser.ver = RegExp["$1"];
  69. browser.safari = parseFloat(browser.ver);
  70. }
  71. else
  72. {
  73. // 近似确定版本号
  74. var safariVersion = 1;
  75. if(engine.webkit < 100)
  76. {
  77. safariVersion = 1;
  78. }
  79. else if(engine.webkit < 312)
  80. {
  81. safariVersion = 1.2;
  82. }
  83. else if(engine.webkit < 412)
  84. {
  85. safariVersion = 1.3;
  86. }
  87. else
  88. {
  89. safariVersion = 2;
  90. }
  91. browser.safari = browser.ver = safariVersion;
  92. }
  93. }
  94. else if(/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^; ]+)/.test(ua))
  95. {
  96. engine.ver = browser.ver = RegExp["$1"];
  97. engine.khtml = browser.konq = parseFloat(engine.ver);
  98. }
  99. else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua))
  100. {
  101. engine.ver = RegExp["$1"];
  102. engine.gecko = parseFloat(engine.ver);
  103.  
  104. // 确定是不是FireFox
  105. if(/firefox\/(\S+)/test(ua))
  106. {
  107. browser.ver = RegExp["$1"];
  108. browser.firefox = parseFloat(engine.ver);
  109. }
  110. }
  111. else if(/MISE ([^; ]+)/.test(ua))
  112. {
  113. engine.ver = browser.ver = RegExp["$1"];
  114. engine.ie = browser.ie = parseFloat(engine.ver);
  115. }
  116.  
  117. // 检测浏览器
  118. browser.ie = engine.ie;
  119. browser.opera = engine.opera;
  120.  
  121. // 检测平台
  122. var p = navigator.platform;
  123. system.win = p.indexOf("Win") == 0;
  124. system.mac = p.indexOf("Mac") == 0;
  125. system.xll = (p == "xll") || (p.indexOf("Linux") == 0);
  126.  
  127. // 检测windows操作系统
  128. if(system.win)
  129. {
  130. if(/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua))
  131. {
  132. if(RegExp["$1"] == "NT")
  133. {
  134. switch(RegExp["$2"])
  135. {
  136. case "5.0":
  137. system.win = "2000";
  138. break;
  139. case "5.1":
  140. system.win = "XP";
  141. break;
  142. case "6.0":
  143. system.win = "Vista";
  144. break;
  145. case "6.1":
  146. system.win = "7";
  147. break;
  148. default:
  149. system.win = "NT";
  150. break;
  151. }
  152. }
  153. else if(RegExp["$1"] == "9x")
  154. {
  155. system.win = "ME";
  156. }
  157. else
  158. {
  159. system.win = RegExp["$1"];
  160. }
  161. }
  162. }
  163.  
  164. // 移动设备
  165. system.iphone = ua.indexOf("iPhone") > -1;
  166. system.ipod = ua.indexOf("iPod") > -1;
  167. system.ipad = ua.indexOf("iPad") > -1;
  168. system.nokiaN = ua.indexOf("NokiaN") > -1;
  169.  
  170. // windows mobile
  171. if(system.win == "CE")
  172. {
  173. system.winMobile = system.win;
  174. }
  175. else if(system.win == "Ph")
  176. {
  177. if(/Windows Phone OS (\d+.\d+)/.test(ua))
  178. {
  179. system.win = "Phone";
  180. system.winMobile = parseFloat(RegExp["$1"]);
  181. }
  182. }
  183.  
  184. // 检测IOS版本
  185. if(system.mac && ua.indexOf("Mobile") > -1)
  186. {
  187. if(/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua))
  188. {
  189. system.ios = parseFloat(RegExp.$1.replace("_","."));
  190. }
  191. else
  192. {
  193. system.ios = 2;
  194. }
  195. }
  196.  
  197. // 检测Android
  198. if(/Android (\d+\.\d+)/.test(ua))
  199. {
  200. system.android = parseFloat(RegExp.$1);
  201. }
  202.  
  203. // 游戏系统
  204. system.wii = ua.indexOf("Wii") > -1;
  205. system.ps = /playstation/i.test(ua);
  206.  
  207. // 返回结果
  208. return {
  209. engine:engine,
  210. browser:browser,
  211. system:system
  212. };
  213. }();

二、事件的跨浏览器处理

/* *参数:ele-->元素,type-->事件类型,不带on,handler-->事件处理程序 */ var EventHandler = { addHandler:function(ele,type,handler){               //添加处理程序 // DOM2级事件处理 if(ele.addEventListener){ ele.addEventListener(type,handler,false); }else if(ele.attachEvent){ ele.attachEvent("on"+type,handler); }else{ // DOM0级事件处理 ele["on"+type] = handler; } }, removeHandler:function(ele,type,handler){            //删除处理程序 if(ele.removeEventListener){ ele.removeEventListener(type,handler,false); }else if(ele.detachEvent){ ele.detachEvent("on"+type,handler); }else{ ele["on"+type] = null; } },

getEvent:function(event){ //获取事件对象

return event?event:window.event;

},

getTarget:function(event){ //获取事件目标

return event.target || event.srcElement;

},

preventDefault:function(event){ //阻止事件默认行为

if(event.preventDefault){

event.preventDefault();

}else{

event.returnValue = false;

}

},

stopPropagation:function(event){ //阻止事件流

if(event.stopPropagation){

event.stopPropagation();

}else{

event.cancelBubble = true;

}

},

getRelatedTarget:function(event){ //在mouseover和mouseout中获取相关元素

if(event.relatedTarget){

return event.relatedTarget;

}else if(event.toElement){ //IE8及以下版本不支持relatedTarget属性

return event.toElement;

}else if(event.fromElement){

return event.fromElement;

}else{

return null;

}

},

getWheelDelta:function(event){ //获取鼠标滚轮数据

if(event.wheelDelta){

return (client.engine.opera && client.engine.opera < 9.5?-event.wheelDelta:event.wheelDelta);

}else{

return –event.detail*40; //针对FireFox

}

},

getCharCode:function(event){ //获取字符编码

if(event.charCode == “number”){

return event.charCode;

}else{

return event.keyCode;

}

}, };

存在的不足之处敬请见谅。

原文首发:http://www.ido321.com/1403.html

DOM(十四):代理检测和事件处理(跨浏览器)的更多相关文章

  1. Android入门(十四)内容提供器-实现跨程序共享实例

    原文链接:http://www.orlion.ga/661/ 打开SQLite博文中创建的 DatabaseDemo项目,首先将 MyDatabaseHelper中使用 Toast弹出创建数据库成功的 ...

  2. Java设计模式菜鸟系列(十四)代理模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39856435 代理模式(Proxy):代理模式事实上就是多一个代理类出来,替原对象进行一些 ...

  3. .NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理

    通过 ASP.NET Core,开发者可轻松配置和管理其应用的安全性. ASP.NET Core 中包含管理身份验证.授权.数据保护.SSL 强制.应用机密.请求防伪保护及 CORS 管理等等安全方面 ...

  4. 爱创课堂每日一题第五十四天- 列举IE 与其他浏览器不一样的特性?

    IE支持currentStyle,FIrefox使用getComputStyle IE 使用innerText,Firefox使用textContent 滤镜方面:IE:filter:alpha(op ...

  5. JS原生事件处理(跨浏览器)

    一.关于获取事件对象 FF有点倔强,只支持arguments[0],不支持window.event.这次真的不怪IE,虽然把event作为window的属性不合规范,但大家都已经默许这个小问题存在了, ...

  6. 代理模式 PROXY Surrogate 结构型 设计模式(十四)

    代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...

  7. JS事件流、DOM事件流、IE事件处理、跨浏览器事件处理、事件对象与类型

    事件的移除 removeEventListener() 第二个参数需要指定要移除的事件句柄,不能是匿名函数,因为无法识别 想要移除成功,那么三个参数必须跟addEventListener中的三个完全一 ...

  8. JavaScript(第二十四天)【事件对象】

    JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功能.最方便和强大的就是事件对象,他们可以帮你处理鼠标事件和键盘敲击方面的情况,此外还可以修改一般事件的 ...

  9. JavaScript高级程序设计:第十四章

    第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...

随机推荐

  1. A. Wrong Subtraction

    A. Wrong Subtraction time limit per test 1 second memory limit per test 256 megabytes input standard ...

  2. SvcUtil.exe导入WCF

    1.SvcUtil.exe路径 vs2012.2013为C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin 2.添加外部工具 vs-工具-- ...

  3. Tomcat在处理GET和POST请求时产生的乱码问题

    最近一直在做关于Servlet的事情,常常出现乱码,很是烦人,处理乱码的方法有时候有效,有时候没有效果,今天抽个时间小结一下,以防以后再出现这种问题. 一般的处理乱码的方式都是用: request.s ...

  4. springMVC初探视图解析器——InternalResourceViewResolver

    springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器. springmvc里提供了多个视图解析器,InternalResourceViewResolver就 ...

  5. Murano Weekly Meeting 2016.08.09

    Meeting time: 2016.August.09 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: ...

  6. DP:凑零钱问题/最长非降子序列(C++)

    你给出一定数额的钱 i 元给我,我利用手中的硬币(m元, j元, k元...)兑换等值的钱给你,要求硬币数最少. 举例:给出1-11的钱,手中硬币有1元,3元,5元. 重点是找到状态和状态转移方程. ...

  7. Clouder Manager安装时出现please remove the following file: /etc/cloudera-scm-server/db.properties问题解决(图文详解)

    问题详情 bigdata@ubuntucmbigdata1:/opt/softwares/cm-$ sudo ./cloudera-manager-installer.bin This install ...

  8. Windows下Redis数据库管理工具(redis-desktop-manager)安装与配置(图文详解)

    Redis Desktop Manager安装 Redis Desktop Manager直接下载安装就行非常简单.下载地址: 官网下载:https://redisdesktop.com/downlo ...

  9. 04-spring中的aop演示

    1 xml配置 1 导包 2 准备对象 package www.test.service; public interface UserService { public abstract void ad ...

  10. mongodb3集群搭建

    三台服务器:先设置hosts 10.0.0.231 node1 10.0.0.232 node2 10.0.0.233 node3 1:下载 mongodb-linux-x86_64-rhel70-3 ...