DOM(十四):代理检测和事件处理(跨浏览器)
一、检测
用于用户代理检测,检测范围包括浏览器引擎、平台、Windows、移动设备和游戏系统等
- /*
- *用户代理检测脚本,检测范围包括浏览器引擎、平台、Windows、移动设备和游戏系统
- */
- var client = function()
- {
- //呈现引擎
- var engine = {
- ie:0, //ie
- gecko:0, //火狐
- webkit:0, //chrome和safari
- khtml:0, //Linux下的Konqueror
- opera:0, //opera
- 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, //UNIX
- //移动设备
- iphone:false,
- ipod:false,
- ipad:false,
- ios:false,
- android:false,
- nokiaN:false, //诺基亚
- winMobile:false, //windows mobile
- //游戏系统
- wii:false, //Wii
- ps:false //Playstation 3
- };
- //检测呈现引擎和浏览器
- 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(browser.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.konq = 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(engine.ver);
- }
- }
- else if(/MISE ([^; ]+)/.test(ua))
- {
- engine.ver = browser.ver = RegExp["$1"];
- engine.ie = browser.ie = parseFloat(engine.ver);
- }
- // 检测浏览器
- browser.ie = engine.ie;
- browser.opera = engine.opera;
- // 检测平台
- var p = navigator.platform;
- system.win = p.indexOf("Win") == 0;
- system.mac = p.indexOf("Mac") == 0;
- system.xll = (p == "xll") || (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;
- 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+)/.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.android = parseFloat(RegExp.$1);
- }
- // 游戏系统
- system.wii = ua.indexOf("Wii") > -1;
- system.ps = /playstation/i.test(ua);
- // 返回结果
- return {
- engine:engine,
- browser:browser,
- system:system
- };
- }();
二、事件的跨浏览器处理
/* *参数: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(十四):代理检测和事件处理(跨浏览器)的更多相关文章
- Android入门(十四)内容提供器-实现跨程序共享实例
原文链接:http://www.orlion.ga/661/ 打开SQLite博文中创建的 DatabaseDemo项目,首先将 MyDatabaseHelper中使用 Toast弹出创建数据库成功的 ...
- Java设计模式菜鸟系列(十四)代理模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39856435 代理模式(Proxy):代理模式事实上就是多一个代理类出来,替原对象进行一些 ...
- .NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理
通过 ASP.NET Core,开发者可轻松配置和管理其应用的安全性. ASP.NET Core 中包含管理身份验证.授权.数据保护.SSL 强制.应用机密.请求防伪保护及 CORS 管理等等安全方面 ...
- 爱创课堂每日一题第五十四天- 列举IE 与其他浏览器不一样的特性?
IE支持currentStyle,FIrefox使用getComputStyle IE 使用innerText,Firefox使用textContent 滤镜方面:IE:filter:alpha(op ...
- JS原生事件处理(跨浏览器)
一.关于获取事件对象 FF有点倔强,只支持arguments[0],不支持window.event.这次真的不怪IE,虽然把event作为window的属性不合规范,但大家都已经默许这个小问题存在了, ...
- 代理模式 PROXY Surrogate 结构型 设计模式(十四)
代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...
- JS事件流、DOM事件流、IE事件处理、跨浏览器事件处理、事件对象与类型
事件的移除 removeEventListener() 第二个参数需要指定要移除的事件句柄,不能是匿名函数,因为无法识别 想要移除成功,那么三个参数必须跟addEventListener中的三个完全一 ...
- JavaScript(第二十四天)【事件对象】
JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功能.最方便和强大的就是事件对象,他们可以帮你处理鼠标事件和键盘敲击方面的情况,此外还可以修改一般事件的 ...
- JavaScript高级程序设计:第十四章
第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...
随机推荐
- A. Wrong Subtraction
A. Wrong Subtraction time limit per test 1 second memory limit per test 256 megabytes input standard ...
- SvcUtil.exe导入WCF
1.SvcUtil.exe路径 vs2012.2013为C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin 2.添加外部工具 vs-工具-- ...
- Tomcat在处理GET和POST请求时产生的乱码问题
最近一直在做关于Servlet的事情,常常出现乱码,很是烦人,处理乱码的方法有时候有效,有时候没有效果,今天抽个时间小结一下,以防以后再出现这种问题. 一般的处理乱码的方式都是用: request.s ...
- springMVC初探视图解析器——InternalResourceViewResolver
springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器. springmvc里提供了多个视图解析器,InternalResourceViewResolver就 ...
- Murano Weekly Meeting 2016.08.09
Meeting time: 2016.August.09 1:00~2:00 Chairperson: Kirill Zaitsev, from Mirantis Meeting summary: ...
- DP:凑零钱问题/最长非降子序列(C++)
你给出一定数额的钱 i 元给我,我利用手中的硬币(m元, j元, k元...)兑换等值的钱给你,要求硬币数最少. 举例:给出1-11的钱,手中硬币有1元,3元,5元. 重点是找到状态和状态转移方程. ...
- 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 ...
- Windows下Redis数据库管理工具(redis-desktop-manager)安装与配置(图文详解)
Redis Desktop Manager安装 Redis Desktop Manager直接下载安装就行非常简单.下载地址: 官网下载:https://redisdesktop.com/downlo ...
- 04-spring中的aop演示
1 xml配置 1 导包 2 准备对象 package www.test.service; public interface UserService { public abstract void ad ...
- mongodb3集群搭建
三台服务器:先设置hosts 10.0.0.231 node1 10.0.0.232 node2 10.0.0.233 node3 1:下载 mongodb-linux-x86_64-rhel70-3 ...