javascript事件詳解筆記

javascript事件詳解筆記:

一、事件流

     1、事件流:

               描述的是頁面中接受事件的順序,有事件冒泡、事件捕獲兩種。

     2、事件冒泡:

               由最具體的元素接收,然後逐級向上傳播到最不具體的元素的節點(文檔)。 

     3、事件捕獲:

               最不具體的節點先接收事件,而最具體的節點應該是最後接收事件。 

<!DOCTYPE html>

<html>

<head>

    <meta charset="utf-8">

    <title>事件</title>

</head>

<body>

<div id="div1">

    <button id="btn1">按鈕</button>

</div>

</body>

</html> 

1、事件冒泡情況——這種情況使用得最多:

    點擊按鈕後,最先由button#btn1接收,然後傳遞給它的父級div#div1,然後再上級上html,再上級是document,最頂級是window.

    所有瀏覽器都支持 window 對象。它表示瀏覽器窗口。 

    所有Javascript全局對象、函數以及變量均自動成爲 window 對象的成員。(全局變量是 window 對象的屬性,全局函數是 window 對象的方法)。HTML DOM 的 document 也是 window 對象的屬性之一.


2、事件捕獲情況:

    點擊按鈕後最先由document接收,然後是div#div1,然後是button#btn1

二、事件處理

     1、HTML事件處理:

               直接添加到HTML結構中。 

<div id="div">

    <button id="btn1" onclick="myAlert(‘hello')">按鈕</button>

</div>

<script type="text/javascript">

    function myAlert(str){

        alert(str);

    }

</script> 

    

     2、DOM0級事件處理

               把一個函數賦值給一個事件處理程序屬性。 

<div id="div">

    <button id="btn1">按鈕</button>

</div>

<script type="text/javascript">

    var button = document.getElementById("btn1");

    button.onclick = function(){

            alert("hello");

        }

    button.onclick = null; //清除事件

</script> 

這種方式的缺點是,當有多個事件函數同名時前者會被後者覆蓋掉,如 

button.onclick = function(){alert(“hello——1"); }

button.onclick = function(){alert(“hello——2"); }

button.onclick = function(){alert(“hello——3"); } 

//最終只會執行最後一個

     3、DOM2級事件處理——最方便,使用得多

  •                addEventListener(“事件名”, “事件處理函數”, “布爾值”);

  •                true:事件捕獲;

  •                false:事件冒泡;

  •                removeEventListener(); 

var button = document.getElementById("btn1");

    button.addEventListener('click',myAlert1);

    button.addEventListener('click',myAlert2);

    function myAlert1(){

        alert("DOM2級事件處理 1");

    }

    function myAlert2(){

        alert("DOM2級事件處理 2");

    }

button.removeEventListener('click',myAlert1);//移除事件 

這種方式會依次把事件執行; 

     4、IE事件處理程序(版本小於等於8的情況)

               attachEvent——作用和用法與addEventListener一樣(只是需要在事件前加on,如onclick)

               detachEvent——作用和用法與removeEventListener一樣

     5、根據瀏覽器來應用:

var button = document.getElementById("btn1");

    if(button.addEventListener){

        button.addEventListener('click',myAlert1);

    }else if(button.attachEvent){

    button.attachEvent('onclick',myAlert1);

    }else{

        button.onclick = myAlert1();

    }

    function myAlert1(){

        alert("DOM2級事件處理 1");

    } 

三、事件對象(event/e)

     1、事件對象:

               在觸發DOM事件的時候都會產生一個對象; 

     2、事件對象event:

               1) type: 獲取事件類型

               2) target: 獲取事件目標 

 

var button = document.getElementById("btn1");

    button.addEventListener('click',myAlert);

    function myAlert(event){

        console.log(event.type);//==>click

        console.log(event.target.id);//==>btn1

    } 

    

   3) stopPropagation(): 阻止事件冒泡(向上傳遞) 

阻止冒泡前:

var button = document.getElementById("btn1");

 button.addEventListener('click',myAlert);

    function myAlert(event){

     console.log(“button元素觸發”);

    } 

  var div = document.getElementById("div");

    div.addEventListener('click',   myAlert2);

    function myAlert2(){

        console.log("div元素觸發");

    } 


執行後:

button元素觸發

div元素觸發

//事實上經常是點擊按鈕後並不想觸發div元素事件 

阻止冒泡後:

  function myAlert(event){

        console.log("button元素觸發");//==>btn1

        event.stopPropagation();

    } 



//執行結果

button元素觸發 

   4) preventDefault(): 阻止事件默認行爲

<a href="#" id="aa">我是鏈接</a>

var aa = document.getElementById("aa");

    aa.addEventListener('click', clickA);

    function clickA(event){

        event.preventDefault();

    }


//a標籤的默認行爲是打開鏈接,而加入了這個     event.preventDefault();之後再點擊a標籤就不會執行打開鏈接這個動作了 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章