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 02 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
May 27 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
Sep 06 Javascript
H5用户注册表单页 注册模态框!
Sep 17 Javascript
jquery.tableSort.js表格排序插件使用方法详解
Aug 12 Javascript
详解Node.js串行化流程控制
May 04 Javascript
bootstrap实现二级下拉菜单效果
Nov 23 Javascript
vue2.0 中使用transition实现动画效果使用心得
Aug 13 Javascript
浅谈vux之x-input使用以及源码解读
Nov 04 Javascript
新手快速入门微信小程序组件库 iView Weapp
Jun 24 Javascript
js通过循环多张图片实现动画效果
Dec 19 Javascript
详解JavaScript中的执行上下文及调用堆栈
Apr 29 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
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
jQuery UI 应用不同Theme的办法
2010/09/12 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
jQueryUI Sortable 应用Demo(分享)
2017/09/07 jQuery
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
python进阶教程之文本文件的读取和写入
2014/08/29 Python
Windows上使用Python增加或删除权限的方法
2018/04/24 Python
Python面向对象基础入门之设置对象属性
2018/12/11 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
Django如何批量创建Model
2020/09/01 Python
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
个人委托书范本
2014/04/02 职场文书
妇联主席先进事迹
2014/05/18 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL
Pytest中conftest.py的用法
2021/06/27 Python
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL