1. 程式人生 > >DOM 0級 and 2級 事件模型

DOM 0級 and 2級 事件模型

DOM(Document Object Model 檔案物件模型)

DOM將用例如XML、HTML等標記語言寫成的結構化文件看成一顆樹,該樹上的節點也即是文件內的節點。簡單來說,DOM是一組API,可以使使用者通過任何實現了DOM API的語言操縱任何滿足DOM標準的文件。

DOM 0級事件模式

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset='utf-8'>
            <title>Hello World</
title
>
</head> <body> <div class='test'>Test</div> <script> let div = document.getElementsByClassName('test')[0]; div.onclick = function(){ console.log('click'); }
</script> </body> </html>

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset='utf-8'>
            <title>Hello World</title>
        </head>
        <body>
            <div class='test'
onclick='console.log("click)'>
Test</div> </body> </html>

上述程式碼都為類名為test的div綁定了一個click事件發生時觸發的方法。這種為DOM元素設定事件函式的方法便是DOM 0級事件模型中規定的。除此之外,DOM 0級事件模型還不允許為一個元素的同一事件繫結多個處理方法。若綁定了多個,則最後一個函式覆蓋之前的。

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset='utf-8'>
            <title>Hello World</title>
        </head>
        <body>
            <div class='test'>Test</div>
            <script>
                let div = document.getElementsByClassName('test')[0];
                div.onclick = function(){
                    console.log('click');
                }
                //如果使用者點選Test則會在控制檯輸出click again而不是click。
                div.onclick = function(){
                    console.log('click again');
                }
            </script>
        </body>
    </html>

DOM 2級事件模型

DOM 2級事件模型為我們提供兩個方法分別用來新增和移除事件處理方法。

  • addEventListener()
  • removeEventListener()

這兩個方法的前兩個引數是相同的,分別是事件名和事件處理函式(remove方法無法移除匿名函式)。而add方法則多出了一個引數,若傳入true,則事件處理方法在事件捕獲階段被呼叫,反之則在事件冒泡階段被呼叫。


    <!DOCTYPE html>
    <html>
        <head>
            <meta charset='utf-8'>
            <title>Hello World</title>
        </head>
        <body>
            <div class='test'>Test</div>
            <script>
                let div = document.getElementsByClassName('test')[0];
                div.addEventListener('click', function(){
                    console.log('click');
                }, false);
                div.addEventListener('click', function(){
                    console.log('click again');
                }, true);
            </script>
        </body>
    </html>

與DOM 0級不同,DOM 2級事件模型允許你為同個元素的同個事件新增多個事件處理函式,在觸發時間時將會按照文件順序被先後呼叫。

事件的冒泡與捕獲

image

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset='utf-8'>
            <title>Hello World</title>
        </head>
        <body>
            <div id='one'>
                <div id='two'>
                    <div id='three'>
                        <p>Test</p>
                    </div>
                </div>
            </div>
            <script>
                let div1 = document.getElementById('one');
                let div2 = document.getElementById('two');
                let div3 = document.getElementById('three');
                
                div1.addEventListenr('click' , function(event){
                    console.log('one');
                }, false);
                div2.addEventListenr('click' , function(event){
                    console.log('two');
                }, false);
                div3.addEventListenr('click' , function(event){
                    console.log('three');
                }, false);
                
                div1.addEventListenr('click' , function(event){
                    console.log('one');
                }, true);
                div2.addEventListenr('click' , function(event){
                    console.log('two');
                }, true);
                div3.addEventListenr('click' , function(event){
                    console.log('three');
                }, true);
            </script>
        </body>
    </html>