1. 程式人生 > >JS:Html事件處理程序 vs DOM0級事件處理程序 vs DOM2級事件處理程序

JS:Html事件處理程序 vs DOM0級事件處理程序 vs DOM2級事件處理程序

list 屬性 asc hello 並且 賦值 有意義 事件處理程序 自己

1.HTML事件處理程序

某個元素支持的某種事件,可以通過一個與相應事件處理程序同名的HTML特性指定。這個特性的值應該是能夠執行的JS代碼。例如:按鈕單擊是要執行一些js代碼,可以像下面:

<input type="button" value="click me" onclick="showMessage()" />

在js中就可以像下面一樣處理:

<script>

function showMessage(){

alert("hello function");

alert(this == window) // true

}

</script>

此時showMessage中的this指向的window,但是showMessage函數可以被多個元素同時調用。

但是此方法有的缺陷就是js和html耦合在一起,如果要更換事件處理程序,需要改html和js兩個地方。所以很多人喜歡用dom事件處理程序。

2. DOM0級事件處理程序

通過js指定事件處理程序的方式,就是將一個函數賦值給一個事件處理程序的屬性。

每個元素(包括window和document)都有自己的事件處理程序的屬性,這些屬性通常全部小寫,就像onclick,將這個屬性的值設置為一個函數,就可以指定事件處理程序。如下:

<html>
    <head></head>
    <body>
        <input type="button"
value="click me2" id="btn2"> <script> var btn2 = document.getElementById("btn2"); btn2.onclick = function(){ console.log(this); } </script> </body> </html>

上面的this輸出的結果是:<input type="button" value="click me2" id="btn2">,說明dom0級事件處理程序中的this指向的是當前元素本身

,而不是windows,通過this可以訪問元素的任何屬性和任何方法。

3.DOM2級事件處理程序

DOM2級事件定義了兩個方法,用於處理指定和刪除事件處理程序的操作:addEventListener()和removeEventListener().所有的DOM節點都包含這兩個方法,並且接受3個參數,要處理的事件名,作為事件處理程序的函數和一個布爾值。最後一個布爾值如果是true,則表示在捕獲階段,是false則表示在冒泡階段。

<html>
    <head></head>
    <body>
        <input type="button" value="click me2" id="btn2">
        <script>
        var btn2 = document.getElementById("btn2");
        //addEventListener接受3個參數:要處理的事件名,作為事件處理程序的函數和一個布爾值。最後一個布爾值如果是true,則表示在捕獲階段,是false則表示在冒泡階段
        btn2.addEventListener(click,function(){
            console.log(this);
        }, false);
        </script>
    </body>
</html>

上面代碼輸出的結果和dom0級代碼輸出的結果一樣:<input type="button" value="click me2" id="btn2">,說明dom2級事件處理程序中的this指向的是當前元素本身,而不是windows。

註意:addEventListener()方法只能通過removeEventListener()方法來移除。

但是使用removeEventListener()方法移除事件的時候需要註意的一點:

<html>
    <head></head>
    <body>
        <input type="button" value="click me2" id="btn2">
        <script>
        var btn2 = document.getElementById("btn2");
        btn2.addEventListener(click,function(){
            console.log(this);
        }, false);
        btn2.removeEventListener(click,function(){//沒有用
            console.log(this);
        }, false);
        </script>
    </body>
</html>

上面的方法移除click事件是沒有用的,為什麽呢?因為addEventListener和removeEventListener的第二個參數需要同一個函數,而上面的代碼看似是同一個函數,其實不然,它們是功能相同的,但是是不同的匿名函數。如果需要正真移除事件處理程序,需要向下面這樣:

<html>
    <head></head>
    <body>
        <input type="button" value="click me2" id="btn2">
        <script>
        var btn2 = document.getElementById("btn2");
        var handler = function(){
            console.log(this);
        }
        btn2.addEventListener(click, handler, false);
        btn2.removeEventListener(click,handler, false);
        </script>
    </body>
</html>

像上面一樣,就可以保證addEventListener和removeEventListener的第二個參數是同一個函數。

attachEvent()與detachEvent()

在早期的IE瀏覽器,如:IE8中,沒有實現addEventListener()removeEventListener(),但提供了兩個替代方法attachEvent()detachEvent()。由於Microsoft當前最新的系統Windows 10中,已放棄IEedge瀏覽器替代,所在attachEvent()detachEvent()已沒有意義。

上面的內容基本上是從《JavaScript高級程序設計》摘抄,在加上自己的一些理解。如果有錯誤,歡迎指正。

JS:Html事件處理程序 vs DOM0級事件處理程序 vs DOM2級事件處理程序