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 07 Javascript
js获取键盘按键响应事件(兼容各浏览器)
May 16 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
Dec 27 Javascript
Angular用来控制元素的展示与否的原生指令介绍
Jan 07 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
Mar 27 Javascript
JS Array.slice 截取数组的实现方法
Jan 02 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
Jul 01 Javascript
JavaScript 闭包详细介绍
Sep 28 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
Sep 29 Javascript
ES6 javascript的异步操作实例详解
Oct 30 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
Jul 09 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 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
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
php结合ajax实现赞、顶、踩功能实例
2014/05/12 PHP
一个简单的php路由类
2016/05/29 PHP
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
jQuery异步加载数据并添加事件示例
2014/08/24 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
聊一聊JS中this的指向问题
2016/06/17 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
基于vue、react实现倒计时效果
2019/08/26 Javascript
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
Python饼状图的绘制实例
2019/01/15 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
python的sorted用法详解
2019/06/25 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
Python 解析简单的XML数据
2020/07/24 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
Python文件操作的面试题
2013/06/22 面试题
Java如何支持I18N?
2016/10/31 面试题
遥感技术与仪器求职信
2014/02/22 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
工会换届选举方案
2014/05/21 职场文书
大学英语专业求职信
2014/06/21 职场文书
小升初自荐信范文
2015/03/05 职场文书
商业计划书如何写?关键问题有哪些?
2019/07/11 职场文书