利用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 相关文章推荐
dwr spring的集成实现代码
Mar 22 Javascript
jQuery Ajax使用 全解析
Dec 15 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
js格式化金额可选是否带千分位以及保留精度
Jan 28 Javascript
jquery仿搜索自动联想功能代码
May 23 Javascript
纯javascript实现自动发送邮件
Oct 21 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
Jun 06 Javascript
JS中this上下文对象使用方式
Oct 09 Javascript
记React connect的几种写法(小结)
Sep 18 Javascript
Vue2.x通用编辑组件的封装及应用详解
May 28 Javascript
JS Generator 函数的含义与用法实例总结
Apr 08 Javascript
Vue父子之间值传递的实例教程
Jul 02 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 实用代码收集
2010/01/22 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
PHP中的socket_read和socket_recv区别详解
2015/02/09 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
javascript之可拖动的iframe效果代码
2008/08/01 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
jquery键盘事件使用介绍
2011/11/01 Javascript
javascript 通用loading动画效果实例代码
2014/01/14 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
如何编写jquery插件
2017/03/29 jQuery
JS查找孩子节点简单示例
2019/07/25 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
Python 异常处理的实例详解
2017/09/11 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
解决Django中多条件查询的问题
2019/07/18 Python
python mysql断开重连的实现方法
2019/07/26 Python
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
入股协议书范本
2014/04/14 职场文书
冬季施工防火方案
2014/05/17 职场文书
生产实习心得体会范文
2016/01/22 职场文书