事件是將JavaScript與網頁聯繫在一塊兒的主要方式。
事件流:從頁面中接收到事件的順序。
IE的事件流叫作事件冒泡:事件開始時由最具體 的元素(文檔中嵌套層次最深的那個節點)接收,而後逐級向上傳播到較爲不具體 的節點(文檔)。javascript
Netscape Communicator團隊提出的,與事件冒泡相反。html
用意:在事件到達預約目標以前捕獲它。java
「DOM2 級事件」規定的事件流包括三個階段:事件捕獲階段、處於目標階段、事件冒泡階段。瀏覽器
事件:用戶或瀏覽器自身執行的某種動做。如:click
、load
、mouseover
等。事件處理程序:響應某個事件的函數。函數
HTML事件處理程序性能
<script type="text/javascript"> function showMessage(){ alert("Hello World!"); } </script>
<input type="button" value ="Click Me" onclick="showMessage()" />
DOM0 級事件處理程序測試
var btn = document.getElementById("myBtn"); btn.onclick = function (){ alert(this.id); }
btn.onclick = null;
DOM2 級事件處理程序this
addEventListener(要處理的事件名, 做爲事件處理程序的函數,布爾值)
code
removeEventListener(要處理的事件名, 做爲事件處理程序的函數,布爾值)
htm
布爾值:
true
:在捕獲階段調用事件處理程序false
:在冒泡階段調用事件處理程序var btn = document.getElementById("myBtn"); var hander = function(){ alert(this.id); }; // 添加事件處理程序 btn.addEventListener("click", hander, false); // 刪除事件處理程序 btn.removeEventListener("click", hander, false);
主要好處:能夠添加多個事件處理程序,按照添加的順序觸發。
IE事件處理程序
attachEvent(事件處理程序名稱, 事件處理程序函數)
detachEvent(事件處理程序名稱, 事件處理程序函數)
var btn = document.getElementById("myBtn"); var hander = function(){ alert(this.id); }; // 添加事件處理程序 btn.attachEventr("onclick", hander); // 刪除事件處理程序 btn.detachEvent("onclick", hander);
主要好處:能夠添加多個事件處理程序,按照添加相反的順序觸發。
跨瀏覽器的事件處理程序
addHander(要操做的元素, 事件名稱, 事件處理程序函數)
removeHander(要操做的元素, 事件名稱, 事件處理程序函數)
event
事件對象
阻止事件捕獲、事件冒泡:
var btn = document.getElementById("myBtn"); btn.onclick = function(event){ alert("Clicked"); event.stopPropagation(); }; document.body.onclick = function(event){ alert("Body clicked"); };
UI事件:不必定與用戶操做有關的事件
焦點事件
鍵盤與文本事件
目的:解決「事件處理程序過多」問題。
實現:利用了事件冒泡,只指定一個事件處理程序,就能夠管理某一類型的全部事件。
使用事件委託,只須要在 DOM 樹中儘可能最高的層次上添加一個事件處理程序。
以下例子,因爲全部列表項都是這個元素"myLinks"的子節點,並且它們的事件會冒泡,因此單擊事件最終會被這個函數處理。
<!DOCTYPE html> <html> <head> <title>Event Delegation Example</title> <script type="text/javascript" src="EventUtil.js"></script> </head> <body> <ul id="myLinks"> <li id="goSomewhere">Go somewhere</li> <li id="doSomething">Do something</li> <li id="sayHi">Say hi</li> </ul> <script type="text/javascript"> (function(){ var list = document.getElementById("myLinks"); EventUtil.addHandler(list, "click", function(event){ event = EventUtil.getEvent(event); var target = EventUtil.getTarget(event); switch(target.id){ case "doSomething": document.title = "I changed the document's title"; break; case "goSomewhere": location.href = "http://www.wrox.com"; break; case "sayHi": alert("hi"); break; } }); })(); </script> </body> </html>
btn.onclick = null;
onunload
事件處理程序移除全部事件處理程序。以避免內存中留有「空事件處理程序」。在測試Web應用程序中,模擬觸發事件是一種極其有用的技術。
流程: