老牌技术员详解firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
中钢网资深技术大牛看了推荐firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码,老牌网友认真推荐,学技术的朋友快来顶一下!
在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() 方法来统一处理 事件问题。
先写到这里,大家继续。。
以上就是小编分享的firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码有需要的用户可以按照上述步骤设置解决问题,当然方法不止这一种,更多知识等着我们去发现!
上一篇:小编解惑深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
下一篇:高手传授讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
本文标题:老牌技术员详解firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
本文地址:https://www.tabangni.com/jsstudy/49698.html
查看更多与“IE事件处理FireFox”有关的文章
推荐阅读
- 1老牌技术员详解firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
- 2老牌码农解惑推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
- 3笔者讲诉js基于cookie方式记住返回页面用法示例
- 4大神讲诉判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
- 5站长解读比例尺、缩略图、平移缩放之百度地图添加控件方法
- 6手把手演示解决WordPress使用CDN后博文无法评论的错误
- 7初级技术员解读JavaScript 异步调用框架 (Part 3 - 代码实现)
- 8高手研习ES6新数据结构Map功能与用法示例
- 9图文研习BootStrap Fileinput初始化时的一些参数
- 10中级技术员解惑html中table数据排序的js代码
最近更新
- 01-21老牌技术员详解firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
- 01-21老牌码农解惑推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
- 01-21笔者讲诉js基于cookie方式记住返回页面用法示例
- 01-21老司机指导CSS选择器的使用技巧
- 01-21大神讲诉判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
- 01-21精确查找PHP WEBSHELL木马 修正版
- 01-21ubuntu16.04搭建nfs服务的方法
- 01-21笔者解读ASP.net(c#)打造24小时天气预报及实时天气
- 01-21PHP实现简单的新闻发布系统实例
- 01-21ABP入门系列之分页功能的实现