利用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编程起步(第三课)
Feb 27 Javascript
LazyLoad 延迟加载(按需加载)
May 31 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
Aug 23 Javascript
理解JavaScript中worker事件api
Dec 25 Javascript
详解用函数式编程对JavaScript进行断舍离
Sep 18 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
Jan 08 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
Jun 19 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
Nov 30 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
Dec 25 Javascript
爬虫利器Puppeteer实战
Jan 09 Javascript
使用webpack4编译并压缩ES6代码的方法示例
Apr 24 Javascript
JavaScript 实现轮播图特效的示例
Nov 05 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
浅谈电磁辐射对健康的影响
2021/03/01 无线电
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
CI框架常用方法小结
2016/05/17 PHP
php组合排序简单实现方法
2016/10/15 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
javascript 的Document属性和方法集合
2010/01/25 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
innerText 使用示例
2014/01/23 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
独特的python循环语句
2016/11/20 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
python装饰器常见使用方法分析
2019/06/26 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
通过实例学习Python Excel操作
2020/01/06 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
python和js交互调用的方法
2020/06/23 Python
python实现定时发送邮件
2020/12/23 Python
大四学年自我鉴定
2013/11/13 职场文书
初级党校心得体会
2014/09/11 职场文书
部队2014年终工作总结
2014/11/27 职场文书
保护动物的宣传语
2015/07/13 职场文书