事件检测
作者:手气不错 来源:gracecode.com 发布时间:2009-04-11 18:03:00
给浏览器绑定事件有时候是非常痛苦的事情,不同的浏览器提供不尽相同的功能的同时,也提供了不同的事件。例如,IE 系列的浏览器支持 mouseenter/mouseleave 事件;Opera 不支持 contextmenu 以及 input 相关的 onbeforepaste、onbeforecut 等事件。
浏览器之间不同程度的事件支持情况,会加重编写跨浏览器的开发成本。而在某种“无奈”的情况下(特别针对 IE),我们都会采用浏览器嗅探来决定绑定不同的事件,例如绑定鼠标滚轮事件:
if (Env.ua.ie) { Event.on(document, 'mousewheel', callback);} else { Event.on(document, 'DOMMouseScroll', callback);}
或者另外中做法就是干脆绑定两个事件。虽然这也能很正常的工作,但我们都了解,无论是基于浏览器嗅探还是重复绑定无用的事件,这都是不完美的解决方案。
Juriy Zaytsev 的代码给了我们解决这个问题的些启示,他利用 DOM 的特性,来判断针对某元素是否支持具体事件。例如
var el = document.createElement('div');el.setAttribute('onclick', 'return;');typeof el.onclick; // "function"el.setAttribute('onclick2', 'return;');typeof el.onclick2; // "undefined"
那么,根据这一特性,就可以编写出不依赖浏览器嗅探的事件检测脚本,原文的最终例子
var isEventSupported = (function() { // 根据特有的事件创建对应的 HTML 元素 var TAGNAMES = { 'select':'input','change':'input', 'submit':'form','reset':'form', 'error':'img','load':'img','abort':'img' } function isEventSupported(eventName) { var el = document.createElement(TAGNAMES[eventName] || 'div'); eventName = 'on' + eventName; // 检测元素是否已经包含了对应的事件 var isSupported = (eventName in el); // 如果没有对应事件,则尝试增加对应事件,然后判断是否为回调 if (!isSupported) { el.setAttribute(eventName, 'return;'); isSupported = typeof el[eventName] == 'function'; } el = null; return isSupported; } return isEventSupported;})();
那么,判断是否为 Opera 浏览器使用
isEventSupported("contextmenu")
就好过
navigator.userAgent.indexOf('Opera') > -1
而且,以后如果 Opera“修复”了该问题,由于 isEventSupported("contextmenu") 返回的是 true,从而也可保证代码健壮的运行。
最后,原文作者写了个简单的测试页面,用于检测具体浏览器的 DOM Level2 的支持情况。
猜你喜欢
- 使用 IE8 时发现其原生的 JSON 解析器存在 Bug,让我们先用 IE8 打开 DEMO 页面体验下。http://lab.grace
- 一、Position1、语法:position:static/ absolute / fixed / relative2、参数:(1)sta
- 一、软件准备:以下均为截止2005-4-20的最新正式版本PHP(5.1.2):http://www.php.netMySQL(5.0.19
- 如: 2000-1-1==> 2000-01-01、2000-01-1==>2000-01-01、2000-1-01==>
- 在动态删除iframe时,同时把iframe里嵌套的iframe 删除,遇到了这个问题。本来之前都没报错,突然昨天他们嵌套了一个 跨域 的网
- 1. 首先,你需要安装最新的服务包为了提高服务器安全性,最有效的一个方法就是升级到SQL Server 2000 Service Pack
- QQ影音新版发布官网Banner经过两周的酝酿、脑爆与设计调整,于20日顺利上线,连续7天,经历了昨天激动人心的最后发布,到此告一段落,这里
- 下面就来介绍下SQL Server 2008中使用的端口有哪些:首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果我们要远程
- 【译者的话】 作为一家非盈利性的防止青少年 * 的机构, Five Alive 希望拥有一个独特的标志来配合机构的宣传。他们决定在网站上通过竞
- <SCRIPT language="javascript"> function&nbs
- CSSer与其他IT职位一样,在找工作的时候,都会面临着面试官提出的问题,或者给出的试卷。一、超链接点击过后hover样式就不出现的问题?被
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 11 - Using Fx.Morph, Fx O
- 有使用过VS2005开发工具的朋友或者其他语句如js中都有Try catch 语句块,那么在mysql中是否能有SQLserver的@@er
- 以下是引用片段:Function c2u(myText) Dim i c2u = "" For i = 1 to Len
- 为满足用户的视觉追求及产品的背景图片的换肤功能,设计师难免在设计上会用到半透明的效果。因此页面重构师基于视觉及产品的需要,采用了PNG32的
- 孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslog
- MySQL从5.1开始支持event功能,类似oracle的job功能。有了这个功能之后我们就可以让MySQL自动的执行数据汇总等功能,不用
- XSL(EXtensible Stylesheet Language)它是指可扩展样式表语言。 XSL之于 XML 就像 CSS 之于 HT
- 我设了个排卖的起始时间然后设了一个结束时间现在要精确到小时比如提示 “离到期时间:1天XX小时”大家有什么想法吗?我就是在小时总是不能实现,
- 随着网络的发展,网速和机器速度的提高,越来越多的网站用到了丰富客户端技术。而现在Ajax则是最为流行的一种方式。JavaScript是一种解