利用jQuery的$.event.fix函数统一浏览器event事件处理


Posted in Javascript onDecember 21, 2009

比如得到触发事件的元素引用在IE浏览器下是:event.srcElement,在FF浏览器下则是:event.target,另外又比如在FF浏览器下得到光标相对页面的位置是event.pageX,而IE浏览器下的处理方式又是不一样的,当然还有一些像“阻止事件冒泡”以及“取消浏览器默认行为”等,不同浏览器也有不同的处理方式,如果我们要使JavaScript在不同的浏览器下能正常处理事件代码,就要分别进行判断处理。现在jQuery为我们提供了统一兼容处理函数$.event.fix(e),这个函数官方并没有在文档中说明用法,是我在阅读框架代码的时候发现可以这样使用。
一、如何使用
使用jQuery的event兼容处理主要分以下几个简单步骤进行:
1、在网页head区引用jQuery框架库文件;
2、定义一个事件处理方法,在调用的地方统一传入event参数;
3、在事件方法内部首先利用$.event.fix把旧的事件转换成新的事件引用;
4、在事件方法后面使用经过兼容处理后的事件对象方法和属性。
二、使用示例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>利用jQuery的$.event.fix函数统一浏览器event处理</title> 
<script type="text/javascript" src="http://img.3water.com/jslib/jquery/jquery.js"></script> 
</head> 
<body> 
<input type="button" value="http://w3water.com" onclick="eventHandler(event)" /> 
<script type="text/javascript"> 
//请使用不同浏览器测试本页,你将看到一样的结果 
function eventHandler(e) 
{ 
var event = $.event.fix(e); 
var elem = event.target; 
alert('当前点击对象的标签名是:' + elem.tagName); 
alert('当前点击按钮文本是:' + elem.value); 
alert('pageX:' + event.pageX + ',pageY:' + event.pageY); 
//得到按键码 
event.keyCode 
//取消浏览器默认行为 
event.preventDefault(); 
//取消事件冒泡 
event.stopPropagation(); 
//...还有好些不是很常用属性,这里不一一列举 
} 
</script> 
</body> 
</html>

三、jQuery $.event.fix方法定义原代码参考
fix: function(event) 
{ 
if (event[expando] == true) 
return event; 
// store a copy of the original event object 
// and "clone" to set read-only properties 
var originalEvent = event; 
event = 
{ 
originalEvent: originalEvent 
}; 
var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" "); 
for (var i = props.length; i; i--) 
event[props[i]] = originalEvent[props[i]]; 
// Mark it as fixed 
event[expando] = true; 
// add preventDefault and stopPropagation since 
// they will not work on the clone 
event.preventDefault = function() 
{ 
// if preventDefault exists run it on the original event 
if (originalEvent.preventDefault) 
originalEvent.preventDefault(); 
// otherwise set the returnValue property of the original event to false (IE) 
originalEvent.returnValue = false; 
}; 
event.stopPropagation = function() 
{ 
// if stopPropagation exists run it on the original event 
if (originalEvent.stopPropagation) 
originalEvent.stopPropagation(); 
// otherwise set the cancelBubble property of the original event to true (IE) 
originalEvent.cancelBubble = true; 
}; 
// Fix timeStamp 
event.timeStamp = event.timeStamp || now(); 
// Fix target property, if necessary 
if (!event.target) 
event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either 
// check if target is a textnode (safari) 
if (event.target.nodeType == 3) 
event.target = event.target.parentNode; 
// Add relatedTarget, if necessary 
if (!event.relatedTarget && event.fromElement) 
event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; 
// Calculate pageX/Y if missing and clientX/Y available 
if (event.pageX == null && event.clientX != null) 
{ 
var doc = document.documentElement, body = document.body; 
event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0); 
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0); 
} 
// Add which for key events 
if (!event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode)) 
event.which = event.charCode || event.keyCode; 
// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) 
if (!event.metaKey && event.ctrlKey) 
event.metaKey = event.ctrlKey; 
// Add which for click: 1 == left; 2 == middle; 3 == right 
// Note: button is not normalized, so don't use it 
if (!event.which && event.button) 
event.which = (event.button & 1 ? 1 : (event.button & 2 ? 3 : (event.button & 4 ? 2 : 0))); 
return event; 
}

作者:WebFlash
出处:http://webflash.cnblogs.com
Javascript 相关文章推荐
Javascript 面向对象之重载
May 04 Javascript
cnblogs TagCloud基于jquery的实现代码
Jun 11 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
Aug 11 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
Sep 05 Javascript
浏览器打开层自动缓慢展开收缩实例代码
Jul 04 Javascript
12种不宜使用的Javascript语法整理
Nov 04 Javascript
javascript实现uploadify上传格式以及个数限制
Nov 23 Javascript
js中遍历Map对象的方法
Jul 27 Javascript
js修改onclick动作的四种方法(推荐)
Aug 18 Javascript
Three.js如何实现雾化效果示例代码
Sep 27 Javascript
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 Javascript
微信小程序实现滚动Tab选项卡
Nov 16 Javascript
jQuery 连续列表实现代码
Dec 21 #Javascript
jQuery解决iframe高度自适应代码
Dec 20 #Javascript
IE 上下滚动展示模仿Marquee机制
Dec 20 #Javascript
js控制div及网页相关属性的代码
Dec 19 #Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
Dec 19 #Javascript
JS 的应用开发初探(mootools)
Dec 19 #Javascript
用js实现层随着内容大小动态渐变改变 推荐
Dec 19 #Javascript
You might like
php与paypal整合方法
2010/11/28 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
php实现阳历阴历互转的方法
2015/10/28 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
javascript globalStorage类代码
2009/06/04 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
webpack4 入门最简单的例子介绍
2018/09/05 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
python的range和linspace使用详解
2019/11/27 Python
PyTorch中permute的用法详解
2019/12/30 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
自荐信格式简述
2014/01/25 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
工业设计专业自荐书
2014/06/05 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
家属答谢词
2015/01/05 职场文书
考研复习计划
2015/01/19 职场文书
董事长岗位职责
2015/02/13 职场文书
预备党员半年考察意见
2015/06/01 职场文书