利用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 iframe内的函数调用实现方法
Jul 19 Javascript
JQuery的AJAX实现文件下载的小例子
May 15 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
Oct 10 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
Oct 14 Javascript
javascript模块化简单解析
Apr 07 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 Javascript
JS实现的简单标签点击切换功能示例
Sep 21 Javascript
vuejs实现标签选项卡动态更改css样式的方法
May 31 Javascript
微信小程序引用iconfont图标的方法
Oct 22 Javascript
弱类型语言javascript中 a,b 的运算实例小结
Aug 07 Javascript
VUE实现自身整体组件销毁的示例代码
Jan 13 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
ip签名探针
2006/10/09 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
Vue.js tab实现选项卡切换
2017/05/16 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
js实现中文实时时钟
2020/01/15 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
Python 实现删除某路径下文件及文件夹的实例讲解
2018/04/24 Python
python实现俄罗斯方块游戏
2020/03/25 Python
Python笔记之工厂模式
2019/11/20 Python
Django实现celery定时任务过程解析
2020/04/21 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
Linux常见面试题
2016/10/04 面试题
测试工程师职业规划书
2014/02/06 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
研究生个人学年总结
2015/02/14 职场文书
志愿者个人总结
2015/03/03 职场文书
音乐课外活动总结
2015/05/09 职场文书
入党心得体会
2019/06/20 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS
MySQL常用慢查询分析工具详解
2022/08/14 MySQL