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的面向对象方法以及差别
Mar 31 Javascript
JS版网站风格切换实例代码
Oct 06 Javascript
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
Jun 25 Javascript
js控制frameSet示例
Sep 10 Javascript
详解JavaScript中shift()方法的使用
Jun 09 Javascript
js改变css样式的三种方法推荐
Jun 28 Javascript
详解本地Node.js服务器作为api服务器的解决办法
Feb 28 Javascript
JavaScript递归算法生成树形菜单
Aug 15 Javascript
jQuery获取复选框选中的当前行的某个字段的值
Sep 15 jQuery
React Native react-navigation 导航使用详解
Dec 01 Javascript
vue中typescript装饰器的使用方法超实用教程
Jun 17 Javascript
在vue中封装方法以及多处引用该方法详解
Aug 14 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
Thinkphp实现MySQL读写分离操作示例
2014/06/25 PHP
Zend Guard使用指南及问题处理
2015/01/07 PHP
php实现微信支付之企业付款
2018/05/30 PHP
动态添加js事件实现代码
2009/03/12 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
python自动化测试实例解析
2014/09/28 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
python 日志增量抓取实现方法
2018/04/28 Python
pandas带有重复索引操作方法
2018/06/08 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
元旦晚会感言
2014/03/12 职场文书
党员干部公开承诺书
2014/03/26 职场文书
企业环保标语
2014/06/10 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
2015年酒店工作总结
2015/04/28 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL
Golang 并发编程 SingleFlight模式
2022/04/26 Golang
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android