1. 程式人生 > >JavaScript高階程式設計之事件

JavaScript高階程式設計之事件

當用戶按下某個按鈕是,就會觸發對應事件,事件在執行註冊事件時,繫結的程式,實現一次成功的瀏覽器與JS之間的互動。其中事件基於設計模式中的觀察者模式原理實現,但又有些不同,事件它還擁有著一些屬於自己的特點。

事件流

  事件冒泡是IE的產物,它的流向,是自下向上,從繫結事件的具體元素開始,一直流到具體元素的最頂級元素。

  事件捕獲是網景的產物,它的流向與事件冒泡正好相反,是自上向下的,從繫結時間的具體元素的頂級元素開始,一直流到繫結事件的具體元素。目前主流的瀏覽器既至此冒泡又支援捕獲,不過一般冒泡就能滿足需求。

事件處理

  HTML事件處理通過在HTML標籤上邊新增對應的事件屬性,並把值設為要執行的程式碼或函式。例:<a href="javascript:void;" onclick = "aa(this,event)" ></a>。此例中,onclick是事件屬性,表示事件為點選事件。aa是事件觸發時,要執行的函式。this指向的是a標籤的節點物件,event指向的是事件物件。這種事件的處理方式,有個很有意思的地方,你可以使用區域性變數的方式,去使用document和元素本身的成員。

  Dom0級事件處理通過元素節點物件本身的事件屬性來繫結事件。例:document.onclick = function(){};此例中,onclick是document物件的屬性,它的預設值是null,當需要繫結事件時,把需要觸發的函式作為值賦給它,而當需要解除繫結時,把其值再設為null就可以。這種方式使用起來很方便,而且做到了,js與HTML的解耦,不過此方式只能繫結一次事件,無法繫結多個事件。

  Dom2級事件處理通過提供的API來進行事件的繫結與解綁。一共兩個方法,一個是addEventListener(),另一個是removeEventListener()。前者用於繫結事件,接收三個引數,第一個事件名,第二個事件處理函式,第三個可選表示在什麼時候開始執行事件處理程式,true為捕獲階段,false為冒泡階段。後者用於解綁事件,引數和前者的方法相同,也就是說,如果傳入的函式不同,是無法取消事件的,也就是說,用匿名函式繫結的事件,是無法被取消的。這種方式,可以給元素繫結多個事件,並且觸發事件時,會按順序依次觸發繫結的事件。

記憶體和效能

在DOM程式設計中,通常會因為實現某個功能而刪除DOM節點。若是DOM上綁有事件,移出節點時,事件是不會解綁的,必須要手動解綁。但是在刪除節點時,工程師們往往不會去手動解綁事件,這就造成了,元素被刪除了,事件的引用還在記憶體中,長此下去,效能上就會出現問題。

事件委託用於解決事件繫結存在的效能問題。其原理利用了事件冒泡的特性,繫結事件時,給元素的父級繫結事件,而不直接繫結到子元素上,然後通過判斷來判斷觸發事件的是不是子元素,然後在執行具體程式碼。