zoukankan      html  css  js  c++  java
  • 跨浏览器的事件处理程序

    事件流 
    提起事件,第一个要提及的就是这个事件流,举个例子

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head>
    <body>
    <div id="box">
      <a href="#" id="aa">点击我</a>
    </div>
    <script type="text/javascript">
      var box=document.getElementById("box")
      var aa=document.getElementById("aa")
      aa.addEventListener("click",function(){
        alert("点击成功")
      })
      box.addEventListener("click",function(){
        alert("点击成功")
      })
      document.body.addEventListener("click",function(){
        alert("点击成功")
      })
    </script>
    </body>
    </html>

    自己下去实验一下,就会发现,页面弹出了三次,我只是在这个a标签上面点击了一下,就冒泡到了div层,body层。 
    这个就是事件的冒泡机制,先从最具体的元素开始,一层一层往上 
    事件捕获就是反过来的,从最大的范围开始,一直捕获到最具体的元素。

    事件处理函数 
    html事件处理函数 
    DOM0级事件处理函数 
    DOM2级事件处理函数 
    IE事件处理函数

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head>
    <body>
      <div id="box">
        <a href="#" id="aa">点击我</a>
      </div>
    <script type="text/javascript">
      function addHandler(elem,type,fn){
        if(elem.addEventListener){
          elem.addEventListener(type,fn,false)
        }else if(elem.attachEvent){
          elem.attachEvent("on"+type,fn)
        }else{
          elem["on"+type]=fn
        }
      }
      var a=document.getElementById("aa")
      addHandler(a,'click',function(){
      alert(111)
      })
    </script>
    </body> 
    </html>

    这里我们不推荐html事件处理函数,所以上面的函数,兼容了DOM0级,DOM2级,IE。

    function removeHandler(elem, type, fn) {
      if (elem.addEventListener) {
        elem.removeEventListener(type, fn, false)
      } else if (elem.attachEvent) {
        elem.detachEvent("on" + type, fn)
      } else {
        elem["on" + type] = null
      }
    }

    这个是对应的用来取消事件的函数

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

        aa.onclick=function(){
          alert(aa2)
        }

        box.addEventListener("click",function(){
            alert("box")
        },true)

        box.onclick=function(){
          alert("box2")
         }

        document.body.onclick=function(){
            alert("body2")
        }
        document.body.addEventListener("click",function(){
            alert("body")
        },true)
        </script>
    </body>
    </html>

    最后打印出什么,body, box  aa aa2  box2 body2

    事件流包括了三个阶段,事件捕获,处理事件,事件冒泡。 
    第一步,事件捕获阶段,点击了a标签,首先从body开始触发

    document.body.addEventListener("click",function(){
      alert("body")
    },true)

    这个表示,我在捕获阶段就触发事件,所以,弹出body 
    第二步,事件进一步捕获,传到box

    box.addEventListener("click",function(){
      alert("box")
    },true)

    同理,在捕获阶段触发事件,弹出box 
    第三步,继续事件捕获,传到a,这个时候的a已经到底部了。事件捕获已经结束了。开始处理事件了

    aa.addEventListener("click",function(){
      alert("aa")
    })
    a.onclick=function(){
      alert(aa2)
    }

    我们给a标签定义了两个事件处理函数,那么到底是先弹出aa,还是aa2呢? 
    这里面我们弹出的顺序是aa aa2,这是因为我们把aa写在前面,aa2写在后面而已

      
    aa.onclick=function(){
      alert(aa2)
    }
    aa.addEventListener("click",function(){
      alert("aa")
    })   

    这样子就是aa2,aa的顺序了 
    第四步:事件向上冒泡,冒泡到box

    box.onclick=function(){
      alert("box2")
    }

    第五步:继续冒泡,冒泡到body

    box.onclick=function(){
      alert("box2")
    }

    我们工作中不会这样变态的例子,这只是便于我们弄懂而已

    下一个章节,整理了关于事件对象的知识点,点击这里http://www.cnblogs.com/yiyistar/p/6500850.html

  • 相关阅读:
    JAVASCRIPT函数定义表达式和函数声明的区别
    单链表
    Asp.net+jquery+ajaxpro异步仿Facebook纵向时间轴效果
    基于Hadoop开发网络云盘系统客户端界面设计初稿
    U盘安装CentOS 6.4 + Windows 7双系统 (Windows 7下安装 CentOS 6.4)
    Last_SQL_Errno: 1050
    delphi 7中使用idhttp抓取网页 解决假死现象(使用TIdAntiFreezeControl控件)
    继承CWnd自绘按钮
    gcc编译器对宽字符的识别
    解决Qt程序发布时中文乱码问题(通过QApplication.addLibraryPath加载QTextCodec插件)
  • 原文地址:https://www.cnblogs.com/yiyistar/p/6497537.html
Copyright © 2011-2022 走看看