当前位置: 首页 > 图文教程 > 网络编程 > Javascript > firefox 和 ie 事件处理的细节,研究,再研究-----书写同时兼容ie和ff的事件处理代码

Javascript
JS option location 页面跳转实现代码
ExtJS 简介 让你知道extjs是什么
ExtJs 学习笔记 Hello World!
ExtJs 学习笔记基础篇 Ext组件的使用
ExtJs 学习笔记 Ext.Panle Ext.TabPanel Ext.Viewport
漂亮的脚本日历,和大家分享
JS Tween 颜色渐变
js 图片轮播(5张图片)
开发跨浏览器javascript常见注意事项
通用JS事件写法实现代码
Js 订制自己的AlertBox(信息提示框)
js 浮动层菜单收藏
JavaScript入门教程(10) 认识其他对象
JQuery 常用方法基础教程
jQuery 页面载入进度条实现代码
jQuery Ajax 全解析
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
Ext JS Grid在IE6 下宽度的问题解决方法
js window.event对象详尽解析
JavaScript 悬浮窗口实现代码

Javascript 中的 firefox 和 ie 事件处理的细节,研究,再研究-----书写同时兼容ie和ff的事件处理代码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 217 ::
收藏到网摘: n/a

在ie中,事件对象是作为一个全局变量来保存和维护的。 所有的浏览器事件,不管是用户触发
的,还是其他事件, 都会更新window.event 对象。 所以在代码中,只要轻松调用 window.event
就可以轻松获取 事件对象, 再 event.srcElement 就可以取得触发事件的元素进行进一步处理
在ff中, 事件对象却不是全局对象,一般情况下,是现场发生,现场使用,ff把事件对象自动传
递给对应的事件处理函数。 在代码中,函数的第一个参数就是ff下的事件对象了。
以上是我个人对两个浏览器下的事件处理方法的粗浅理解,可能说得不是很明白,我写些代码来
详细说明一下
1 <button id="btn1">按钮1</button>
2 <button id="btn2">按钮2</button>
3 <button id="btn3">按钮3</button>
4
5 <script>
6
7 window.onload=function(){
8 document.getElementById("btn1").onclick=foo1
9 document.getElementById("btn2").onclick=foo2
10 document.getElementById("btn3").onclick=foo3
11 }
12
13 function foo1(){
14 //ie中, window.event使全局对象
15 alert(window.event) // ie下,显示 "[object]" , ff下显示 "undefined"
16
17 //ff中, 第一个参数自动从为 事件对象
18 alert(arguments[0]) // ie下,显示 "undefined", ff下显示 "[object]"
19 }
20
21 function foo2(e){
22 alert(window.event) // ie下,显示 "[object]" , ff下显示 "undefined"
23
24 //注意,我从来没有给 foo2传过参数哦。 现在 ff自动传参数给 foo2, 传的参数e 就是事件对象了
25 alert(e) // ie下,显示 "undefined", ff下显示 "[object]"
26 }
27
28 function foo3(){ //同时兼容ie和ff的写法,取事件对象
29 alert(arguments[0] || window.event) // ie 和 ff下,都显示 "[object]"
30 var evt=arguments[0] || window.event
31 var element=evt.srcElement || evt.target //在 ie和ff下 取得 btn3对象
32 alert(element.id) // btn3
33 }
34 </script>
35
看到这里,我们似乎对 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>
方法二: 自动查找
1 <button id="btn4" onclick="foo4()">按钮4</button>
2
3 <script>
4
5 function foo4(){
6 var evt=getEvent()
7 var element=evt.srcElement || evt.target
8 alert(element.id)
9 }
10
11 function getEvent(){ //同时兼容ie和ff的写法
12 if(document.all) return window.event;
13 func=getEvent.caller;
14 while(func!=null){
15 var arg0=func.arguments[0];
16 if(arg0){
17 if((arg0.constructor==Event || arg0.constructor ==MouseEvent)
18 || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){
19 return arg0;
20 }
21 }
22 func=func.caller;
23 }
24 return null;
25 }
26 </script>
27
方法二由 lostinet原创,我在其基础上有所改进, 原函数如下
1function SearchEvent()
2{
3 //IE
4 if(document.all)
5 return window.event;
6
7 func=SearchEvent.caller;
8 while(func!=null)
9 {
10 var arg0=func.arguments[0];
11 if(arg0)
12 {
13 if(arg0.constructor==Event)
14 return arg0;
15 }
16 func=func.caller;
17 }
18 return null;
19}
简单总结:
以上两个解决方法中,都正确处理 ff和ie下 的事件处理 (不管是onclick="foo()",方式还是 onclick=foo方式)
但是个人建议用 getEvent() 方法来统一处理 事件问题。
先写到这里,大家继续。。