firefox事件处理之自动查找event的函数(用于onclick=foo())


Posted in Javascript onAugust 05, 2010

IE与firefox事件处理
在ie中,事件对象是作为一个全局变量来保存和维护的。 所有的浏览器事件,不管是用户触发
的,还是其他事件, 都会更新window.event 对象。 所以在代码中,只要轻松调用 window.event
就可以轻松获取 事件对象, 再 event.srcElement 就可以取得触发事件的元素进行进一步处理
在ff中, 事件对象却不是全局对象,一般情况下,是现场发生,现场使用,ff把事件对象自动传
递给对应的事件处理函数。 在代码中,函数的第一个参数就是ff下的事件对象了。
以上是我个人对两个浏览器下的事件处理方法的粗浅理解,可能说得不是很明白,我写些代码来
详细说明一下

<button id="btn1">按钮1</button> 
<button id="btn2">按钮2</button> 
<button id="btn3">按钮3</button> 
<script> 
window.onload=function(){ 
document.getElementById("btn1").onclick=foo1 
document.getElementById("btn2").onclick=foo2 
document.getElementById("btn3").onclick=foo3 
} 
function foo1(){ 
//ie中, window.event使全局对象 
alert(window.event) // ie下,显示 "[object]" , ff下显示 "undefined" 
//ff中, 第一个参数自动从为 事件对象 
alert(arguments[0]) // ie下,显示 "undefined", ff下显示 "[object]" 
} 
function foo2(e){ 
alert(window.event) // ie下,显示 "[object]" , ff下显示 "undefined" 
//注意,我从来没有给 foo2传过参数哦。 现在 ff自动传参数给 foo2, 传的参数e 就是事件对象了 
alert(e) // ie下,显示 "undefined", ff下显示 "[object]" 
} 
function foo3(){ //同时兼容ie和ff的写法,取事件对象 
alert(arguments[0] || window.event) // ie 和 ff下,都显示 "[object]" 
var evt=arguments[0] || window.event 
var element=evt.srcElement || evt.target //在 ie和ff下 取得 btn3对象 
alert(element.id) // btn3 
} 
</script>

看到这里,我们似乎对 ie和ff的事件处理方式都已经理解了,并找到了解决的办法。
但是。。。。事情还没有结束。
看代码
<button id="btn" onclick="foo()">按钮1</button> 
<script> 
function foo(){ 
alert(arguments[0] || window.event) 
} 
</script>

很不幸,我们 foo给我们的结果是 undefined, 而不是期望的 object
原因在于 事件绑定的方式
onclick="foo()" 就是直接执行了, foo() 函数,没有任何参数的,
这种情况下 firefox没有机会传递任何参数给foo
而 btn.onclick=foo 这种情况, 因为不是直接执行函数,firefox才有机会传参数给foo
解决方法:
方法一:比较笨的方法,既然 firefox没有机会传参数,那么自己勤快点,自己传
<button id="btn" onclick="foo(event)">按钮</button> 
<script> 
function foo(){ 
alert(arguments[0] || window.event) 
var evt=arguments[0] || window.event 
var element=evt.srcElement || evt.target 
alert(element.id) 
} 
</script>

方法二: 自动查找
<button id="btn4" onclick="foo4()">按钮4</button> 
<script> 
function foo4(){ 
var evt=getEvent() 
var element=evt.srcElement || evt.target 
alert(element.id) 
} 
function getEvent(){ //同时兼容ie和ff的写法 
if(document.all) return window.event; 
func=getEvent.caller; 
while(func!=null){ 
var arg0=func.arguments[0]; 
if(arg0){ 
if((arg0.constructor==Event || arg0.constructor ==MouseEvent) 
|| (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){ 
return arg0; 
} 
} 
func=func.caller; 
} 
return null; 
} 
</script>

方法二由 lostinet原创,我在其基础上有所改进, 原函数如下
function SearchEvent() 
{ 
//IE 
if(document.all) 
return window.event; 
func=SearchEvent.caller; 
while(func!=null) 
{ 
var arg0=func.arguments[0]; 
if(arg0) 
{ 
if(arg0.constructor==Event) 
return arg0; 
} 
func=func.caller; 
} 
return null; 
}

简单总结:
以上两个解决方法中,都正确处理 ff和ie下 的事件处理 (不管是onclick="foo()",方式还是 onclick=foo方式)
但是个人建议用 getEvent() 方法来统一处理 事件问题。
Javascript 相关文章推荐
IE与FireFox的兼容性问题分析
Apr 22 Javascript
JQuery 图片延迟加载并等比缩放插件
Nov 09 Javascript
JS 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
一个js导致的jquery失效问题的解决方法
Nov 27 Javascript
JS动态修改iframe高度和宽度的方法
Apr 01 Javascript
html+js实现简单的计算器代码(加减乘除)
Jul 12 Javascript
如何用js判断dom是否有存在某class的值
Feb 13 Javascript
javascript填充默认头像方法
Feb 22 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
May 03 Javascript
vue项目实现图片上传功能
Dec 23 Javascript
Vue组件为什么data必须是一个函数
Jun 11 Javascript
uniapp实现横向滚动选择日期
Oct 21 Javascript
Js获取事件对象代码
Aug 05 #Javascript
zeroclipboard复制到剪切板的flash
Aug 04 #Javascript
jQuery Study Notes学习笔记 (二)
Aug 04 #Javascript
JQuery Study Notes 学习笔记(一)
Aug 04 #Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
Aug 03 #Javascript
基于jquery的让textarea自适应高度的插件
Aug 03 #Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
Aug 03 #Javascript
You might like
PHP5 安装方法
2007/01/15 PHP
php 无限级数据JSON格式及JS解析
2010/07/17 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
webpack实用小功能介绍
2018/01/02 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
JavaScript this关键字的深入详解
2021/01/14 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
使用Python3制作TCP端口扫描器
2017/04/17 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
python分布式计算dispy的使用详解
2019/12/22 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
详解Python中namedtuple的使用
2020/04/27 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
Python修改DBF文件指定列
2020/12/19 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
中专毕业生的自我鉴定
2013/12/01 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
分居协议书范本
2014/11/03 职场文书
模范教师材料大全
2014/12/16 职场文书
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL