事件检测

作者:手气不错 来源: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 的支持情况。

标签:JavaScript,浏览器,事件
0
投稿

猜你喜欢

  • ASP连接MySQL数据库的方法

    2010-03-14 11:25:00
  • 如何由Sybase向SQL Server移植数据库

    2009-01-20 15:56:00
  • Design IT.(2),关于好设计

    2008-09-08 12:44:00
  • 静态页面利用JS读取cookies记住用户信息

    2011-04-14 11:17:00
  • 特效代码:弹出一个淡入淡出的提示框

    2008-05-22 17:11:00
  • asp fso type属性取得文件类型代码

    2009-02-04 10:09:00
  • 白鸦:界面烂还是界面设计烂?

    2008-04-03 16:05:00
  • 历数Firefox2.0对XML处理的改进

    2007-11-27 12:41:00
  • 如何固定表格的标题行和标题列

    2007-09-20 13:03:00
  • JavaScript代码着色器

    2010-01-22 15:53:00
  • MySQL 函数过程递归

    2008-07-25 19:32:00
  • MySQL查询优化

    2009-03-09 14:41:00
  • 如何处理好网页色彩搭配

    2007-08-10 13:22:00
  • javascript 动态插入技术

    2009-12-14 20:50:00
  • sqlserver 存储过程带事务 拼接id 返回值

    2012-11-30 20:06:39
  • 只有mdf文件的数据库附加失败的修复方法分享(置疑、只读)

    2012-02-12 15:55:17
  • 用一条SQL实现:一行多个字段数据的最大值

    2008-12-31 13:37:00
  • [翻译]标记语言和样式手册 Chapter 2 标题

    2008-01-16 11:56:00
  • Dreamweaver MX打造弹出“向导”

    2009-07-21 12:41:00
  • SQL语句操作主从关系表

    2011-06-19 13:19:05
  • asp之家 网络编程 m.aspxhome.com