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实现分割提取页面所需内容
May 09 Javascript
Jquery中使用setInterval和setTimeout的方法
Apr 08 Javascript
简单谈谈JavaScript的同步与异步
Dec 31 Javascript
微信小程序 后台登录(非微信账号)实例详解
Mar 31 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
May 17 Javascript
Vue的MVVM实现方法
Aug 16 Javascript
详解ES6语法之可迭代协议和迭代器协议
Jan 13 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
Apr 20 Javascript
详解VueJs中的V-bind指令
May 03 Javascript
在移动端使用vue-router和keep-alive的方法示例
Dec 02 Javascript
详解Vue、element-ui、axios实现省市区三级联动
May 07 Javascript
JavaScript中的函数式编程详解
Aug 22 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
桌面中心(四)数据显示
2006/10/09 PHP
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
详解webpack 多页面/入口支持&amp;公共组件单独打包
2017/06/29 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
Python连接mysql数据库的正确姿势
2016/02/03 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
python实现PID算法及测试的例子
2019/08/08 Python
Django中template for如何使用方法
2021/01/31 Python
党章学习思想汇报
2014/01/14 职场文书
MySQL库表名大小写的选择
2021/06/05 MySQL
mysql sock文件存储了什么信息
2022/07/15 MySQL