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 脚本的加载与执行
Apr 19 Javascript
$.ajax返回的JSON无法执行success的解决方法
Sep 09 Javascript
js定时调用方法成功后并停止调用示例
Apr 08 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
Jul 12 Javascript
windows下vue-cli及webpack搭建安装环境
Apr 25 Javascript
详解webpack+vue-cli项目打包技巧
Jun 17 Javascript
Angular2.js实现表单验证详解
Jun 23 Javascript
手写Node静态资源服务器的实现方法
Mar 20 Javascript
使用Angular CLI进行Build(构建)和Serve详解
Mar 24 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
Apr 04 jQuery
vue自定义正在加载动画的例子
Nov 14 Javascript
Vue解决echart在element的tab切换时显示不正确问题
Aug 03 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
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
Vue如何实现响应式系统
2018/07/11 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
Python实现简单拆分PDF文件的方法
2015/07/30 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
python日志logging模块使用方法分析
2019/05/23 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
django-allauth入门学习和使用详解
2019/07/03 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
护士实习自我鉴定
2013/10/22 职场文书
医学生求职自荐信
2013/10/25 职场文书
代理班主任的自我评价
2014/02/04 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
安全承诺书
2015/01/19 职场文书
Python 图片添加美颜效果
2022/04/28 Python
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技