javascript---33--event對象事件監聽

event對象 冒泡與捕獲

<style>
    *{
        padding: 0;
        margin: 0;
    }
      .box{
          width: 100px;
          height: 100px;
          background-color: #f66;
      }

  </style>
</head>
<body>
    <div class="box"></div>
</body>
<script>
    var oBox =document.getElementsByClassName("box")[0];
    oBox.abc =function(){
        alert("自定義屬性");
    }
    oBox.abc();//這樣就會自執行 彈出“自定義屬性”
    oBox.onclick=function () {
        alert("點擊事件");
    }
</script>
  1. DOM 0級
  • onclick 被認爲是元素的屬性方法
oBox.onclick=function () {
    console.log(this);    
    }

此時打印的是節點

  1. 模擬默認點擊事件
 oBox.onclick=function (a) {
       console.log(a);
    }

默認爲MouseEvent {isTrusted: true, screenX: 89, screenY: 101, clientX: 89, clientY: 35, …}event 事件對象 默認傳參給函數的第一個參數 保存了觸發事件的參數:事件類型ele.type 鼠標位置 節點

oBox.abc =function(a){
       console.log(a)
    }

這樣顯示undefined 沒有event事件對象

oBox.onclick=function (a) {
       console.log(a);
    }
    oBox.click();

就會觸發事件函數 MouseEvent {isTrusted: false, screenX: 0, screenY: 0, clientX: 0, clientY: 0, …}

  1. ie8不傳event參數 兼容寫法
oBox.onclick=function (event) {
        event =event||window.event;//IE低版本瀏覽器會默認掛載到window下的event屬性裏   這是一個全局對象
       console.log(event);
    }
    oBox.click();

DOM二級事件

 oBox.onclick=function (event) {
        event =event ||window.event;//IE低版本瀏覽器會默認掛載到window下的event屬性裏   這是一個全局對象
       console.log("你好");
    }
    oBox.onclick=function (event) {
        event =event ||window.event;//IE低版本瀏覽器會默認掛載到window下的event屬性裏   這是一個全局對象
        console.log("不好");
    }

這樣後面的事件會覆蓋前面的點擊事件

  1. 主流瀏覽器 addEventListener()
  • 第一個參數 事件類型 :click
  • 第二個參數 事件函數:
  • 第三個參數 是否捕獲
var oBox =document.getElementsByClassName("box")[0];
   oBox.addEventListener("click",function (e) {
        console.log("1",this)
   },false);
    oBox.addEventListener("click",function (e) {
        console.log("2",this)
    },false);

這樣可以同時觸發兩個事件

  1. removeEventListener()
  • 第一個參數 事件類型 :click
  • 第二個參數 事件函數:
  • 第三個參數 是否捕獲 true 使用捕獲 false 使用冒泡
var oBox =document.getElementsByClassName("box")[0];
    var fn1 =function (e) {
        console.log("1",this)
    };
   oBox.addEventListener("click",fn1,false);
    document.ondblclick = function(){
        console.log("取消");
        oBox.removeEventListener("click",fn1,false)
    }

會註銷事件 雙擊等於兩次單擊 所以會出現單擊事件 但是雙擊之後事件註銷

 var oBox =document.getElementsByClassName("box")[0];
    var fn1 =function (e) {
        console.log("1",this);
        this.removeEventListener("click",fn1,false);
    };
   oBox.addEventListener("click",fn1,false);

只能點擊一次

註冊事件傳的參數要和註銷事件傳的參數一一對應

 var oBox =document.getElementsByClassName("box")[0];
    var fn1 =function (e) {
        console.log("1",this);
        this.removeEventListener("click",fn1,true);
    };
   oBox.addEventListener("click",fn1,false);

這樣就不會註銷單擊事件了

捕獲和冒泡的區別

  1. 冒泡 從底層一層一層往上冒
var oBox =document.getElementsByClassName("box")[0];
    var capture =false;
    document.addEventListener("click",function () {
        console.log("document點擊");
    },capture);
    document.body.addEventListener("click",function () {
        console.log("body點擊");
    },capture);
   oBox.addEventListener("click",function () {
       console.log("box點擊");
   },capture);

觸發順序 box點擊 body點擊 document點擊

  1. 捕獲 從最頂層開始觸發到底層然後回到頂層
 var oBox =document.getElementsByClassName("box")[0];
    var capture =true;
    document.addEventListener("click",function () {
        console.log("document點擊");
    },capture);
    document.body.addEventListener("click",function () {
        console.log("body點擊");
    },capture);
   oBox.addEventListener("click",function () {
       console.log("box點擊");
   },capture);

document點擊 body點擊 box點擊

  1. 只想box觸發 停止冒泡
var oBox =document.getElementsByClassName("box")[0];
    var capture =false;
    document.addEventListener("click",function () {
        console.log("document點擊");
    },capture);
    document.body.addEventListener("click",function () {
        console.log("body點擊");
    },capture);
   oBox.addEventListener("click",function (e) {
       e.stopPropagation();
       console.log("box點擊");
   },capture);

這樣只會打印box點擊

  1. 捕獲 取消事件的傳遞
 var oBox =document.getElementsByClassName("box")[0];
    var capture =true;
    document.addEventListener("click",function () {
        console.log("document點擊");
    },capture);
    document.body.addEventListener("click",function (e) {
        e.stopPropagation();
        console.log("body點擊");
    },capture);
   oBox.addEventListener("click",function (e) {

       console.log("box點擊");
   },capture);

這樣點擊box 打印的是document點擊 body點擊

IE 瀏覽器 默認爲冒泡

  1. attachEvent()
  • 第一個參數 事件類型 :onclick
  • 第二個參數 事件函數
oBox.attachEvent("onclick",function () {
        console.log(this);
    });

this指向window

  1. 取消事件detachEvent()
var fn1 =function(){
        console.log(1);
    }
    oBox.attachEvent("onclick",fn1);
    document.ondblclick =function () {
        oBox.detachEvent("onclick",fn1);
    }
  1. 雙擊事件等於兩次單擊事件 怎麼解決雙擊時不觸發單擊
document.onclick =function(){
        timer =setTimeout(function () {
            console.log("單擊");
        },300);
    }
    document.ondblclick =function () {
        console.log("雙擊");
        clearTimeout(timer);
    }

但是不推薦

  1. 取消冒泡
var fn1 =function(e){
        e =e||window.event;
        e.cancelBubble =true;
        console.log(1);
    }
    oBox.attachEvent("onclick",fn1);
    var timer;
    document.onclick =function(){
        timer =setTimeout(function () {
            console.log("單擊");
        },300);
    }

監聽事件兼容方法初級版

eventBind(box,"click",function (event) {
        console.log("box點擊");
        eventBind(this,"click",false);
    },false);
    /*ele 元素節點
    * event事件類型
    * Handel 處理事件函數
    * capture 是否爲捕獲
    * */
    function eventBind(ele,event,handle,capture) {
        //包裝函數做處理  用於取消函數和this指向問題
        ele["event"+event] = handle;

        //先判斷瀏覽器是否爲主流瀏覽器
        if (ele.addEventListener){
            ele.addEventListener(event,ele["event"+event],capture);
        }else if (ele.attachEvent){
            ele["event"+event] =function(){
                handle.call(ele,window.event)
            };
            ele.attachEvent("on"+event,ele["event"+event]);
        }
    }
    //註銷事件
    function eventUnbind(ele,event,capture) {
        if (ele.removeEventListener){
            ele.removeEventListener(event,ele["event"+event],capture);
        }else if (ele.detachEvent){
            ele.detachEvent("on"+event,ele["event"+event]);
        }
    }
</script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章