firefox 和 ie 事件处理的细节-----书写同时兼容ie和ff的事件处理代码

本文探讨了Internet Explorer和Firefox中事件处理的区别,特别是在事件对象的获取上。提供了两种兼容方案,确保开发者能正确地在不同浏览器中捕获和利用事件。
  1. 在ie中,事件对象是作为一个全局变量来保存和维护的。 所有的浏览器事件,不管是用户触发
    的,还是其他事件, 都会更新window.event 对象。 所以在代码中,只要轻松调用 window.event
    就可以轻松获取 事件对象, 再 event.srcElement 就可以取得触发事件的元素进行进一步处理
  2. 在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() 方法来统一处理 事件问题。

 先写到这里,大家继续。。

**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值