利用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 相关文章推荐
JS获取IP、MAC和主机名的五种方法
Nov 14 Javascript
jQuery学习笔记之创建DOM元素
Jan 19 Javascript
jQuery实现的导航下拉菜单效果示例
Sep 05 Javascript
js模态对话框使用方法详解
Feb 16 Javascript
运用jQuery写的验证表单(实例讲解)
Jul 06 jQuery
浅谈jQuery框架Ajax常用选项
Jul 08 jQuery
jQuery实现html双向绑定功能示例
Oct 09 jQuery
自定义PC微信扫码登录样式写法
Dec 12 Javascript
Vue学习之组件用法实例详解
Jan 06 Javascript
vue接口请求加密实例
Aug 11 Javascript
Javascript类型判断相关例题及解析
Aug 26 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 Vue.js
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之密码加密的几种方式
2015/07/29 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
jquery ajax执行后台方法
2010/03/18 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
javascript浏览器兼容教程之事件处理
2014/06/09 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
django 发送手机验证码的示例代码
2018/04/25 Python
python如何删除文件中重复的字段
2019/07/16 Python
NumPy排序的实现
2020/01/21 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
木马的传播途径主要有哪些
2016/04/08 面试题
师范生自我鉴定范文
2013/10/05 职场文书
成教毕业生自我鉴定
2013/10/23 职场文书
项目管理计划书
2014/01/09 职场文书
高中生的自我鉴定范文
2014/01/24 职场文书
入党申请自荐书范文
2014/02/11 职场文书
职业女性的职业规划
2014/03/04 职场文书
2015年女生节活动总结
2015/02/27 职场文书
PHP使用非对称加密算法RSA
2021/04/21 PHP
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
pytorch中的 .view()函数的用法介绍
2022/03/17 Python