js 事件处理函数间的Event物件是否全等


Posted in Javascript onApril 08, 2011

这个小问题以前就遇到,却没有去总结
现在又遇到,为了得到准确结论,记录下来:
如题:同一事件 多个执行函数间的Event物件是否全等

例如:

dom.addEvent('click',fna); 
dom.addEvent('click',fnb);

1:在fna里对Event物件添加的属性,在其后执行的fnb函数里是对于Event物件是否能访问到?
2:执行fna/fnb函数时的Event物件是否全等 Eventfna===Eventfnb ?

标准的文档太长哪里是说明了这里的规则呢?懒吧...

对于Jquery,同一事件,多个执行函数间的Event物件是全等的。
Jquery live绑定事件的实现里,对于可能会被重复执行的函数liveHandler,依靠额外给Event物件的liveFired属性,使得在第一次之后执行的liveHandler 的开始 即退出函数:

if (event.liveFired === this || ...) { 
return; 
} 
///.... 
event.liveFired = this;

测试:
function a(e) { 
e.abc = function() { 
alert(a); 
}; 
prevEvent = e; 
prevIeEvent=window.event; 
} 
function b(e,event) { 
e.abc(); //fn 
alert(e === prevEvent); //true 
if(event=window.event){ 
alert(event===e); //false 
alert(event===prevIeEvent);//false 
alert(event===prevEvent);//false 
} 
} 
var t = document.getElementById("p"); 
if (t.addEventListener) { 
t.addEventListener('click', a, false); 
t.addEventListener('click', b, false) 
} else { 
t.attachEvent('onclick', b); 
t.attachEvent('onclick', a) 
}

对于原生绑定事件方式[addEventListener,attachEvent],对于多个执行函数间的Event物件(通过参数传递的event)是全等的,在IE里,通过window.event形式得到的Event物件不全等。与通过参数传递的Event也不全等。
对于冒泡事件:
dom.addEvent('click',fna); 
domParentNode.addEvent('click',fnb);

jquery里,在以trigger形式触发事件时,冒泡事件之间的函数中的Event物件是全等的。而实际用户行为触发的事件,则不是同一物件。自定义属性也传递不了。取值设置都都没有影响真正的originalEvent。
以原生绑定事件方式[addEventListener,attachEvent]:
function a(e) { 
e.abc = function() { 
alert(a); 
}; 
prevEvent = e; 
prevIeEvent=window.event; 
} 
function b(e,event) { 
alert(e.abc); //fn 
alert(e === prevEvent); //true 
if(event=window.event){ 
alert(event===e); //false 
alert(event===prevIeEvent);//false 
alert(event===prevEvent);//false 
} 
} 
var t = document.getElementById("p"); 
if (t.addEventListener) { 
t.addEventListener('click', a, false); 
document.body.addEventListener('click', b, false); 
} else { 
t.attachEvent('onclick', a); 
document.body.attachEvent('onclick', b); 
}

结果是attachEvent绑定事件时IE中冒泡事件之间的函数内Event物件不一致。FF等 以addEventListener 则全等对象。
事实上,在非IE,事件对象Propagation之间的处理函数,或同dom节点触发的多个函数之间的Event物件是全等的。与绑定形式[addEventListener/DOM0]无关。
而在IE,仅同dom节点触发的多个函数之间的通过参数传递的Event物件(attachEvent)是全等的。
Javascript 相关文章推荐
JS去掉第一个字符和最后一个字符的实现代码
Feb 20 Javascript
JSONP跨域的原理解析及其实现介绍
Mar 22 Javascript
js检测iframe是否加载完成的方法
Nov 26 Javascript
HTML5 实现的一个俄罗斯方块实例代码
Sep 19 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
Oct 10 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
Jul 19 jQuery
JavaScript内存泄漏的处理方式
Nov 20 Javascript
解决vue中post方式提交数据后台无法接收的问题
Aug 11 Javascript
详解Vue中使用Axios拦截器
Apr 22 Javascript
layer弹出层扩展主题的方法
Sep 11 Javascript
three.js 制作动态二维码的示例代码
Jul 31 Javascript
vue-cli3配置favicon.ico和title的流程
Oct 27 Javascript
Javascript 八进制转义字符(8进制)
Apr 08 #Javascript
JavaScript中判断函数是new还是()调用的区别说明
Apr 07 #Javascript
JavaScript中清空数组的三种方法分享
Apr 07 #Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
Apr 07 #Javascript
javascript各浏览器中option元素的表现差异
Apr 07 #Javascript
IE6/7/8中Option元素未设value时Select将获取空字符串
Apr 07 #Javascript
我的javascript 函数链之演变
Apr 07 #Javascript
You might like
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
浅析python中的del用法
2020/09/02 Python
django使用多个数据库的方法实例
2021/03/04 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
南京某公司笔试题
2013/01/27 面试题
水利公司纪检监察自我鉴定
2014/02/25 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
就业协议书怎么填
2014/04/11 职场文书
学校教师安全责任书
2014/07/23 职场文书
小学生国庆65周年演讲稿范文(2篇)
2014/09/21 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
公司的力量观后感
2015/06/05 职场文书
在校证明模板
2015/06/17 职场文书
大学生军训感言
2015/08/01 职场文书
中学总务处工作总结
2015/08/12 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
python文件目录操作之os模块
2021/05/08 Python
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
小程序实现文字循环滚动动画
2021/06/14 Javascript
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫
使用CSS实现音波加载效果
2023/05/07 HTML / CSS
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android