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 相关文章推荐
写了一个layout,拖动条连贯,内容区可为iframe
Aug 19 Javascript
jquery查找父元素、子元素(个人经验总结)
Apr 09 Javascript
使用javascript实现雪花飘落的效果
Jan 13 Javascript
javascript的replace方法结合正则使用实例总结
Jun 16 Javascript
js仿百度切换皮肤功能(html+css)
Jul 10 Javascript
Bootstrap登陆注册页面开发教程
Jul 12 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
Oct 24 Javascript
微信小程序中的onLoad详解及简单实例
Apr 05 Javascript
JavaScript复制内容到剪贴板的两种常用方法
Feb 27 Javascript
过滤器vue.filters的使用方法实现
Sep 18 Javascript
Element Popover 弹出框的使用示例
Jul 26 Javascript
Vue Element校验validate的实例
Sep 21 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
php生成略缩图代码
2012/07/16 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
Javascript MD4
2006/12/20 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
jQuery技巧总结
2011/01/01 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
深入理解python try异常处理机制
2016/06/01 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
python3中rank函数的用法
2019/11/27 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
几个判断型的面试题
2012/07/03 面试题
批评与自我批评材料
2014/02/15 职场文书
公务员培的训心得体会
2014/09/01 职场文书
在校证明模板
2015/06/17 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python