事件處理程式就是響應某個事件的函式,簡單地來說,就是函式。我們又把事件處理程式稱為事件偵聽器。事件處理程式是以「on「開頭的,比如點選事件的處理程式是」onclick「,事件處理程式大概由以下5種。
一、html事件處理程式
html事件處理程式,它是寫在html裡面的,是全域性作用域:
例子**--點選事件觸發alert函式當我們需要使用乙個複雜的函式時,將js**寫在這裡面,顯然很不合適,所以有了下面這種寫法:"alert('hello')
">
例子**--點選事件觸發dosomething()函式,這個函式寫在單獨的js檔案或可以看到button.onclick這種形式,這裡事件程式作為了btn物件的方法,是區域性作用域。
所以我們可以用
btn.onclick = null;來刪除指定的事件處理程式。如果我們嘗試給事件新增兩個事件,如:
"輸出,hello again,很明顯,第乙個事件函式被第二個事件函式給覆蓋掉了,所以,dom0級事件處理程式不能新增多個,也不能控制事件流到底是捕獲還是冒泡。btn">點選
三、dom2級事件處理程式(不支援ie)
進一步規範之後,有了dom2級事件處理程式,其中定義了兩個方法:
addeventlistener() 新增事件偵聽器
removeeventlistener() 刪除事件偵聽器
函式具有三個引數:
第乙個引數是要處理的事件名(不帶on字首的才是事件名)
第二個引數是作為事件處理程式的函式
第三個引數是乙個boolean值,預設false表示使用冒泡機制,true表示捕獲機制。
"這時候兩個事件處理程式都能夠成功觸發,說明可以繫結多個事件處理程式,但是注意,如果是定義了一模一樣時監聽方法,是會發生覆蓋的,即同樣的事情和事件流機制下相同的方法只會觸發一次。btn">點選
removeeventlister()方法幾乎和新增時用法一樣:
"這樣的話,事件處理程式只會執行一次。btn">點選
但是要注意,如果同乙個監聽事件分別為」事件捕獲「和」事件冒泡「註冊了一次,一共兩次,者兩次事件需要分別移除。兩者不會互相干擾。
這時候的this指向該元素的引用。
這裡事件觸發的順序時新增的順序。
四、ie事件處理程式
對於internet explorer來說,在ie9之前,你必須使用attachevent而不是使用標準方法addeventlistener。
ie事件處理程式中有類似與dom2級事件處理程式的兩個方法:
1.attachevent()
2.detachevent()
它們都接收兩個引數:
1.事件處理程式名稱。如onclick、onmouseover,注意:這裡不是事件,而是事件處理程式名稱,所以有on。
2.事件處理程式函式。
之所以沒有和dom2級事件處理程式中類似的第三個引數,是因為ie8及更早版本只支援冒泡事件流
"這裡事件觸發的順序不是新增的順序而是新增順序的相反順序。btn">點選
使用attachevent方法有個缺點,this的只會變成window物件的引用而不是觸發事件的元素。
五、跨瀏覽器的事件處理程式
為了相容ie瀏覽器和標準的瀏覽器,我們需要編寫通用的方法來處理:這一部分需要建立兩個方法:var eventutil =
else
if(element.attachevent)
else
},removehandler: function (element, type, handler)
else
if(element.detachevent)
else}};
addhandle()--這個方法職責是視情況來使用dom0級、dom2級、ie事件處理程式來新增事件。
removehandler()--這個方法就是移除使用addhandlert新增的事件。
這兩個方法接收相同的三個引數:
1. 要操作的元素--通過dom方法獲取
2.事件名稱--注意:沒有on,如」click「、」mouseover「
3.事件處理程式函式--對應的函式
使用:
"事件物件事件物件是用來記錄一些事件發生時的相關資訊的物件,但事件物件只有發生時才會產生,並不只能是事件處理函式內部訪問,在所有事件處理函式執行結束後,事件物件就被銷毀。btn">點選
一、屬性
"二、方法btn">點選
event物件主要有以下兩個方法,用於處理事件的傳播(冒泡、捕獲)和事件的取消。
stoppropagation()----冒泡機制下,阻止事件的進一步往上冒泡
"preventdefault()-----用於取消事件的預設操作,比如鏈結的跳轉或者表單的提交,主要是用來阻止標籤的預設行為btn1
">btn1
"content
">content
//這裡會輸出content,阻止了向content的冒泡
"三、相容性go" href="
">禁止跳轉
var go = document.getelementbyid('go'
);function gofn(
event
) go.addeventlistener(
'click
', gofn, false);
當然,事件物件也存在一定的相容性問題,在ie8及以前版本之中,通過設定屬性註冊事件處理程式時,呼叫的時候並未傳遞事件物件,需要通過全域性物件window.event來獲取。解決方法如下:
function getevent(event在ie瀏覽器上面是event事件是沒有preventdefault()這個屬性的,所以在ie上,我們需要設定的屬性是returnvalue)
window.event.returnvalue=falsestoppropagation()也是,所以需要設定cancelbubble,cancelbubble是ie事件物件的乙個屬性,設定這個屬性為true能阻止事件進一步傳播。
event.cancelbubble=true事件委託事件委託就是利用事件冒泡,只指定乙個事件處理程式,就可以管理某一類的所有事件。
"結果是:新更新的html節點或者新新增html節點時,新新增的節點無法繫結事件,更新的節點也無法繫結事件,表現的行為是無法觸發事件。btnadd
">新增
其中一種解決方法是,新增子節點的時候,再次為其新增監聽事件
這也是問題所在:
1.首先我們多次操作dom獲取元素,這樣勢必會降低瀏覽器處理效能
2.事件不具有繼承性,如果我們動態在頁面中新增了乙個元素,那麼還需要重新走一遍上述程式為其新增監聽事件
那麼有沒有更好的方法呢?根據事件的冒泡原理,我們還可以實現另外乙個很重要的功能:事件委託。
我們只監聽最外層的元素,然後在事件函式中根據事件**進行不同的事件處理。這樣,我們新增事件監聽時只需要操作乙個元素,極大的降低了dom訪問,並且不用再給新增的元素新增監聽事件了,因為元素的事件會冒泡到最外層,被我們截獲。
得到
"這裡用父級ul做事件處理,當li被點選時,由於冒泡原理,事件就會冒泡到ul上,因為ul上有點選事件,所以事件就會被觸發,當然,這裡當點選ul的時候也會觸發的,所以要判斷點選的事件是不是li標籤元素。btnadd
">新增
event物件提供了乙個屬性叫target,可以返回事件的目標節點,
這裡用父級ul做事件處理,當li被點選時,由於冒泡原理,事件就會冒泡到ul上,因為ul上有點選事件,所以事件就會觸發,當然,這裡當點選ul的時候,也是會觸發的,所以要判斷點選的物件到底是不是li標籤元素。
event物件提供了乙個屬性叫target,可以返回事件的目標節點,我們成為事件源,也就是說,target就可以表示為當前的事件操作的dom,但是不是真正操作dom,當然,這個是有相容性的,標準瀏覽器用ev.target,ie瀏覽器用event.srcelement,此時只是獲取了當前節點的位置,並不知道是什麼節點名稱,這裡我們用nodename來獲取具體是什麼標籤名,這個返回的是乙個大寫的,我們需要轉成小寫再做比較(習慣問題)。
這樣,我們就實現了我們的事件委託,當然,不是所有的事件都是可以委託的。
適合用事件委託的事件:click,mousedown,mouseup,keydown,keyup,keypress。
當用事件委託的時候,根本就不需要去遍歷元素的子節點,只需要給父級元素新增事件就好了,新增加的節點也可以觸發事件效果。
參考:
事件處理程式
標籤 標籤 點我 如果新增多個輸出資訊或者其他需求,每次都需要尋找此段 更改太麻煩,少這個方法還可行,若千萬行 以上,怎麼找。我們是否靈活方便?由此擴充套件示例2 點我 新增多個輸出資訊或其他需求,如何處理?答 直接在js 定義函式,函式名稱 到html 指定元素屬性 動態事件 的值裡,如上 但是這...
JS事件 事件處理程式之IE事件處理程式
與訪問dom中的event物件不同,要訪問ie中的event物件有幾種不同的方式,取決於指定事件處理程式的方法。在使用dom0級方法新增事件處理程式時,event物件作為window物件乙個屬性存在。來看下面例子。var btn document.getelementbyid mybtn btn.o...
JS事件程式處理
1 事件 使用者 瀏覽器自身執行的某種動作 點選click 載入load,頁面滾動scroll的等 2 事件處理程式 響應某個事件的處理函式,又叫事件偵聽器 事件流1 事件冒泡 由ie提出 由下向上 2 事件捕獲 由netscape團隊提出 由上向下 由於老版本瀏覽器不支援,所以很少使用 3 dom...