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 相关文章推荐
JS查看对象功能代码
Apr 25 Javascript
一个javascript图片阅览组件
Nov 09 Javascript
jQuery的12招常用技巧分享
Aug 08 Javascript
jquery中ajax学习笔记4
Oct 16 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
JQuery中属性过滤选择器用法实例分析
May 18 Javascript
AngularJS动态添加数据并删除的实例
Feb 27 Javascript
原生JS实现$.param() 函数的方法
Aug 10 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
Sep 07 Javascript
js+canvas实现画板功能
Sep 13 Javascript
vue绑定class的三种方法
Dec 24 Vue.js
VUE解决跨域问题Access to XMLHttpRequest at
May 06 Vue.js
使用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
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
PHP错误机制知识汇总
2016/03/24 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
JS获取IMG图片高宽的简单实例
2016/05/17 Javascript
AngularJS入门教程之数据绑定用法示例
2016/11/01 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
react中使用swiper的具体方法
2018/05/15 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
Python实现视频下载功能
2017/03/14 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
Django模板语言 Tags使用详解
2019/09/09 Python
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
新电JAVA笔试题目
2014/08/31 面试题
车间副主任岗位职责
2013/12/24 职场文书
企业管理培训感言
2014/01/27 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
新教师培训方案
2014/06/08 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS