firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码


Posted in Javascript onApril 12, 2007

在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 相关文章推荐
JavaScript中__proto__与prototype的关系深入理解
Dec 04 Javascript
分享一则JavaScript滚动条插件源码
Mar 03 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
Feb 28 Javascript
jQuery实现全选、反选和不选功能
Aug 16 jQuery
SeaJS中use函数用法实例分析
Oct 10 Javascript
js精确的加减乘除实例
Nov 14 Javascript
Angular5中状态管理的实现
Sep 03 Javascript
vue this.reload 方法 配置
Sep 12 Javascript
Vue路由守卫之路由独享守卫
Sep 25 Javascript
js实现点赞按钮功能的实例代码
Mar 06 Javascript
解决ant Design Search无法输入内容的问题
Oct 29 Javascript
使用prototype.js 的时候应该特别注意的几个问题.
Apr 12 #Javascript
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
Apr 12 #Javascript
ie 处理 gif动画 的onload 事件的一个 bug
Apr 12 #Javascript
无语,javascript居然支持中文(unicode)编程!
Apr 12 #Javascript
几个高效,简洁的字符处理函数
Apr 12 #Javascript
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
Apr 12 #Javascript
身份证号码前六位所代表的省,市,区, 以及地区编码下载
Apr 12 #Javascript
You might like
PHPShop存在多个安全漏洞
2006/10/09 PHP
超级简单的php+mysql留言本源码
2009/11/11 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
JavaScript的Cookies
2008/01/16 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
JS简单计算器实例
2015/01/20 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
vue 中自定义指令改变data中的值
2017/06/02 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
python读取Excel实例详解
2018/08/17 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
golang/python实现归并排序实例代码
2020/08/30 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
党建工作先进材料
2014/05/02 职场文书
感恩之星事迹材料
2014/05/03 职场文书
防灾减灾标语
2014/10/07 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
创业计划书之家教托管
2019/09/25 职场文书