前端JS基礎(chǔ)八(事件)

事件

  • 通用事件綁定
  var btn=document.getElementById(‘btn1’); 
  btn.addEventListener(‘click’,function(event){   //JS事件綁定
    console.log(‘clicked’) 
  })

   //由于addEventListener太長了 我們自己寫一個事件綁定函數(shù)
  function bindEvent(elem,type,fn){  
    elem.addEventListener(type,fn) 
  }

  var a=document.getElementById(‘link1’) 
  bindEvent(a,’click’,function(e){  //事件綁定函數(shù)的使用
    e.preventDefault()  //阻止默認行為 
    alert(‘clicked’) 
  })

注:關(guān)于IE低版本的兼容性 
IE低版本使用attachEvent綁定事件,和W3C標準不一樣

事件冒泡

在父級 div 中定義的事件,會在子級的事件執(zhí)行之后冒泡上來執(zhí)行

  • 阻止事件冒泡 e.stopPropagation()
  <!DOCTYPE html>
  <html>
    <head>
      <meta charset="utf-8">
      <title></title>
    </head>
    <body>
      <div id="div1">
        <p id="p1">激活</p>
        <p id="p2">取消</p>
        <p id="p3">取消</p>
        <p id="p4">取消</p>
      </div>
      <div id="div2">
        <p id="p5">取消</p>
        <p id="p6">取消</p>
      </div>
  
      <script type="text/javascript">
      利用阻止冒泡的機制實現(xiàn):只點擊 p1 的時候彈窗激活
        function bindEvent(elem,type,func) {
          elem.addEventListener(type,func)
        }
        var p1 = document.getElementById('p1')
        bindEvent(p1,'click',function(e){
          e.stopPropagation()
          alert('激活')
        })
        bindEvent(body,'click',function (e) {
          alert('取消')
        })
      </script>
    </body>
  </html>
  • 代理
  <!DOCTYPE html>
  <html>
    <head>
      <meta charset="utf-8">
      <title></title>
    </head>
    <body>
      <div id="div1">
        <p id="p1">激活</p>
        <p id="p2">取消</p>
      </div>
      <div id="div2">
        <p id="p3">取消</p>
        <p id="p4">取消</p>
      </div>
  
      <script type="text/javascript">
      寫一個帶有代理功能的事件監(jiān)聽函數(shù)
      function bindEvent(elem,type,selector,fn){
        if(fn == null){
          fn = selector
          selector = null
        }
        elem.addEventListener(type,function(e){
          var target
          if(selector){
            //代理
            target = e.target  //獲得觸發(fā)事件的元素
            if(target.matches(selector)){ //判斷觸發(fā)事件的類型
              fn.call(target,e) //將fn里的this替換為target
            }        
          }else{
            //不是代理
            fn(e)
          }
        })
      }

      var div1 = document.getElementById('div1')
      bindEvent(div1,'click','a',function(e){
        e.preventDefault()
        console.log(this.innerHTML)
      })

      var p1 = document.getElementById('p1')
      bindEvent(p1,'click',function(e){
        console.log(p1.innerHTML)
      })
      </script>
    </body>
  </html>

練習題

練習題1、編寫一個通用的事件監(jiān)聽函數(shù) 
  看上面的bindEvent函數(shù)

練習題2、描述事件冒泡流程 
  1、DOM樹形結(jié)構(gòu) 
  2、事件冒泡 
  3、阻止冒泡 
  4、冒泡的應(yīng)用(代理) 

練習題3、對于一個無線下拉加載圖片的頁面,如何給每個圖片綁定事件 
  1、使用代理 
  2、知道代理的兩個優(yōu)點 
    (1)代碼簡潔 
    (2)減少瀏覽器內(nèi)存占用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 27,696評論 1 45
  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的。 ??事件,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,538評論 1 11
  • (續(xù)jQuery基礎(chǔ)(1)) 第5章 DOM節(jié)點的復(fù)制與替換 (1)DOM拷貝clone() 克隆節(jié)點是DOM的常...
    凜0_0閱讀 1,363評論 0 8
  • 第1章 鼠標事件 1-1 jQuery鼠標事件之click與dbclick事件 用交互操作中,最簡單直接的操作就是...
    mo默22閱讀 1,304評論 0 6
  • 清風徐來的天臺
    秦憤H閱讀 282評論 2 2