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

  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

原因在于 事件绑定的方式
     οnclick="foo()"   就是直接执行了, foo() 函数,没有任何参数的,
     这种情况下 firefox没有机会传递任何参数给foo
    而 btn.οnclick=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原创,我在其基础上有所改进,  原函数如下

 

 1 function  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下   的事件处理 (不管是οnclick="foo()",方式还是  οnclick=foo方式)
但是个人建议用  getEvent() 方法来统一处理 事件问题。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得
Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值