1. 程式人生 > >09-JS的事件流的概念(重點)

09-JS的事件流的概念(重點)

listen 事件冒泡 版本 向上 log ID 常用事件 javascrip ava

在學習jQuery的事件之前,大家必須要對JS的事件有所了解。看下文

事件的概念

HTML中與javascript交互是通過事件驅動來實現的,例如鼠標點擊事件、頁面的滾動事件onscroll等等,可以向文檔或者文檔中的元素添加事件偵聽器來預訂事件。想要知道這些事件是在什麽時候進行調用的,就需要了解一下“事件流”的概念。

什麽是事件流

事件流描述的是從頁面中接收事件的順序

1、DOM事件流

“DOM2級事件”規定的事件流包括三個階段:

① 事件捕獲階段;

② 處於目標階段;

③ 事件冒泡階段

那麽其實呢,js中還有另外一種綁定事件的方式:看下面代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件流</title>
    <script>

    window.onload = function(){

        var oBtn = document.getElementById(‘btn‘);

        oBtn.addEventListener(‘click‘,function(){
            console.log(‘btn處於事件捕獲階段‘);
        }, true);
        oBtn.addEventListener(‘click‘,function(){
            console.log(‘btn處於事件冒泡階段‘);
        }, false);

        document.addEventListener(‘click‘,function(){
            console.log(‘document處於事件捕獲階段‘);
        }, true);
        document.addEventListener(‘click‘,function(){
            console.log(‘document處於事件冒泡階段‘);
        }, false);

        document.documentElement.addEventListener(‘click‘,function(){
            console.log(‘html處於事件捕獲階段‘);
        }, true);
        document.documentElement.addEventListener(‘click‘,function(){
            console.log(‘html處於事件冒泡階段‘);
        }, false);

        document.body.addEventListener(‘click‘,function(){
            console.log(‘body處於事件捕獲階段‘);
        }, true);
        document.body.addEventListener(‘click‘,function(){
            console.log(‘body處於事件冒泡階段‘);
        }, false);

    };

    </script>
</head>
<body>
    <a href="javascript:;" id="btn">按鈕</a>
</body>
</html>

當我們點擊這個btn的時候,看看頁面都輸出了什麽:

技術分享圖片

在解釋輸出結果為什麽是這樣之前,還有幾個知識點需要了解一下即可:

1、addEventListener

addEventListener 是DOM2 級事件新增的指定事件處理程序的操作,這個方法接收3個參數:要處理的事件名、作為事件處理程序的函數和一個布爾值。最後這個布爾值參數如果是true,表示在捕獲階段調用事件處理程序;如果是false,表示在冒泡階段調用事件處理程序。

2、document、documentElement和document.body三者之間的關系:

document代表的是整個html頁面;

document.documentElement代表的是<html>標簽;

document.body代表的是<body>標簽;

接著我們就來聊聊上面的例子中輸出的結果為什麽是這樣:

在標準的“DOM2級事件”中規定,事件流首先是經過事件捕獲階段,接著是處於目標階段,最後是事件冒泡階段。這裏可以畫個圖示意一下:

技術分享圖片

首先在事件捕獲過程中,document對象首先接收到click事件,然後事件沿著DOM樹依次向下,一直傳播到事件的實際目標,就是id為btn的a標簽。

接著在事件冒泡過程中,事件開始時由最具體的元素(a標簽)接收,然後逐級向上傳播到較為不具體的節點(document)。

需要註意的點:由於老版本的瀏覽器不支持事件捕獲,因此在實際開發中需要使用事件冒泡,在由特殊需要時再使用事件捕獲

補充知識了解即可:

1、IE中的事件流只支持“事件冒泡”,但是版本到了IE9+以後,實現了“DOM2級事件”,也就是說IE9+以後也可以在捕獲階段對元素進行相應的操作。

2、在DOM事件流中,實際的目標在“捕獲階段”不會接收到事件。而是在“處於目標階段”被觸發,並在事件處理中被看成“冒泡階段”的一部分。然後,“冒泡階段”發生,事件又傳播回文檔。

jquery的常用事件

jquery常用的事件,大家一定要熟記在心

技術分享圖片

09-JS的事件流的概念(重點)