firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007-04-12 00:00
871 查看
在ie中,事件对象是作为一个全局变量来保存和维护的。 所有的浏览器事件,不管是用户触发的,还是其他事件, 都会更新window.event 对象。 所以在代码中,只要轻松调用 window.event 就可以轻松获取 事件对象, 再 event.srcElement 就可以取得触发事件的元素进行进一步处理在ff中, 事件对象却不是全局对象,一般情况下,是现场发生,现场使用,ff把事件对象自动传递给对应的事件处理函数。 在代码中,函数的第一个参数就是ff下的事件对象了。
以上是我个人对两个浏览器下的事件处理方法的粗浅理解,可能说得不是很明白,我写些代码来
详细说明一下
看到这里,我们似乎对 ie和ff的事件处理方式都已经理解了,并找到了解决的办法。
但是。。。。事情还没有结束。
看代码
很不幸,我们 foo给我们的结果是 undefined, 而不是期望的 object
原因在于 事件绑定的方式
onclick="foo()" 就是直接执行了, foo() 函数,没有任何参数的,
这种情况下 firefox没有机会传递任何参数给foo
而 btn.onclick=foo 这种情况, 因为不是直接执行函数,firefox才有机会传参数给foo
解决方法:
方法一:比较笨的方法,既然 firefox没有机会传参数,那么自己勤快点,自己传
方法二: 自动查找
方法二由 lostinet原创,我在其基础上有所改进, 原函数如下
简单总结:
以上两个解决方法中,都正确处理 ff和ie下 的事件处理 (不管是onclick="foo()",方式还是 onclick=foo方式)
但是个人建议用 getEvent() 方法来统一处理 事件问题。
先写到这里,大家继续。。
以上是我个人对两个浏览器下的事件处理方法的粗浅理解,可能说得不是很明白,我写些代码来
详细说明一下
<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() 方法来统一处理 事件问题。
先写到这里,大家继续。。
相关文章推荐
- firefox 和 ie 事件处理的细节,研究,再研究-----书写同时兼容ie和ff的事件处理代码 (转)
- firefox 和 ie 事件处理的细节,研究,再研究-----书写同时兼容ie和ff的事件处理代码
- firefox 和 ie 事件处理的细节,研究,再研究-----书写同时兼容ie和ff的事件处理代码
- firefox 和 ie 事件处理的细节-----书写同时兼容ie和ff的事件处理代码
- 书写同时兼容IE和FireFox的事件处理代码
- 同时兼容IE和Firefox的事件(Event)
- JavaScript 事件监听实例代码[兼容IE,firefox] 含注释
- 兼容Firefox IE Chrome的onkeydown事件处理方法
- JavaScript 事件监听实例代码[兼容IE,firefox] 含注释
- 兼容linux firefox和windows ie的xml处理代码
- 同时兼容ie和ff的获取事件的方法
- 按钮提交事件处理(以下方法兼容ie,firefox,chrome)
- 阻止浏览器冒泡事件,兼容firefox和ie
- 兼容IE,firefox的获取节点的文本值的javascript代码
- 浮广告,兼容ie、firefox,多个漂浮不冲突,调用只需两行代码
- FireFox与IE 下js兼容触发click事件的代码
- 兼容IE\Firefox,支持W3C XHTML标准---------漂浮广告代码
- JS拖拽代码兼容FF IE
- 兼容Firefox和IE的onpropertychange事件oninput