• 跨浏览器的事件对象


    当我们在DOM上面触发一个事件的时候,就会调用对应的事件处理函数,这个时候会产生一个事件对象,我们叫做event,这个对象中有着很多的信息,我们来看一看 都有些啥子 先从DOM0级事件处理说起

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head>
    <body>
      <div id="box">aa</div>
      <script type="text/javascript">
        var box=document.getElementById('box');
        box.onclick=function(event){
          alert(event.type)   //"click"
        }
      </script>
    </body>
    </html>

    说明一下,这个event是这个事件函数自动产生的,我可以不叫做event,换成任何名字都可以的

    var box=document.getElementById('box');
    box.onclick=function(ss){
      alert(ss.type)   //"click"
    }

    至于这个event对象,到底怎么来的,我也不知道,只是知道有这个东西。

    说完了DOM0级事件对象,再来看看DOM2级事件对象

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head>
    <body>
      <div id="box">aa</div>
      <script type="text/javascript">
        var box=document.getElementById('box');
        box.addEventListener('click',function(s){
          alert(s.type)  //"click"
        })
      </script>
    </body>
    </html>

    同理,这里我们传入进去了参数是s,这个参数代表了我们的事件对象,他有一个type属性,用来查看事件类型 
    虽然我们可以用任何的变量去接收这个事件对象,但是我们通常情况下,用的是event,约定俗成 
    这个event对象都有些什么属性? 
    具体查看这个链接 http://www.w3school.com.cn/jsref/dom_obj_event.asp
    有两个属性需要区分 
    target与currentTarget 
    target:事件的目标 
    currentTarget:处理程序当前正在处理事件的那个元素

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head>
    <body>
    <div id="box">aa</div>
    <script type="text/javascript">
      var box=document.getElementById('box');
      box.addEventListener('click',function(event){
        alert(event.target==event.currentTarget)  //true
      })
      document.body.addEventListener('click',function(event){
        alert(event.target==event.currentTarget)  //false
      })
    </script>
    </body>
    </html>

    事件是触发在box上面的,这个是实际的目标,也就是target的指向,currentTarget代表当前正在处理事件的对象,当事件冒泡到body上面的时候

    currentTarge就指向了body,但是target不会变化,永远指向的都是box

    stopPropagation方法和bubbles属性

    stopPropagation:取消事件冒泡

    bubbles:只读属性,只有这个属性为true,才能使用stopPropagation()方法

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head>
    <body>
    <div id="box">aa</div>
    <script type="text/javascript">
      var box=document.getElementById('box');
      box.addEventListener('click',function(event){
        event.stopPropagation()
        alert("box")  //"box"
      })
      document.body.addEventListener('click',function(event){
        alert("body")   //不会弹出"body"
      })
    </script>
    </body>
    </html>

    event.preventDefault()方法和cancelable属性

    preventDefault:取消事件的默认行为

    cancelable:只读属性,表明是否可以使用preventDefault()方法

    什么时候会用到这个方法呢?比如说,链接的默认行为是跳转,如果你不想跳转,那就可以用这个方法了

    刚刚说晚了DOM0级和DOM2级的事件对象,来看看IE的事件对象

    在IE浏览器之下,我们可以有多种处理

    var box=document.getElementById('box');
    box.onclick=function(){
      var event=window.event
      alert(event.type) //"click"
    }

    在使用DOM0级的方法添加事件处理程序的时候,这个event对象,是window对象的一个属性存在的 
    但是,如果我们是用attachEvent()添加的,那么就会有一个event对象传入到这事件处理函数

    var box=document.getElementById('box');
    box.attachEvent("onclick",function(event){
      alert(event.type) //"click"
    })

    注意看,由于第一中情况,是作为window对象的属性存在的,这个函数是没有传入参数的,第二个函数是传入了一个event对象参数的 
    来看看这个IE浏览器下的event都有什么属性 
    srcElement :事件的目标,类似于target属性 
    type:事件的类型 
    returnValue:这个布尔值类型,默认为true,如果将这个设置为false,就可以用来取消事件的默认行为,类似于preventDefault()方法 
    cancelBubble:布尔值类型,默认情况是false,设置为true,可以用来阻止事件冒泡,与stopPropagation()方法的用处一样

    function getEvent(event){
       return event?event:window.event
    }

     function getTarget(event){
       return event.target||event.srcElement
     }

     function prevent(event){
       if(event.preventDefault){
       event.preventDefault()
         }else{
            event.returnValue=false
          }
      }

     function cancel(event){
       if(event.stopPropagation){
       event.stopPropagation()
       }else{
       event.cancelBubble=true
       }
     }

    上面是跨浏览器的一些兼容性的问题。一清二楚,很简单的封装

  • 相关阅读:
    UVa LA 2965
    UVa LA 3695
    UVa LA 3029 City Game 状态拆分,最大子矩阵O(n2) 难度:2
    Uva LA 3177
    Uva LA 3902
    Uva 11520
    UVa Live 3635
    python学习笔记-day05 字典
    python学习笔记-day04 元组
    python学习笔记 day04 列表增删改查
  • 原文地址:https://www.cnblogs.com/yiyistar/p/6500850.html
Copyright © 2020-2023  润新知