摘要:與之間的交互是通過事件實現的。而,則將事件一直冒泡到對象。事件處理程序的名字以開頭,例如。級事件處理程序通過指定事件處理程序的傳統方式,就是將一個函數賦值給一個事件處理程序屬性。變動事件在結構發生變化時觸發,比如插入或者刪除節點。
javascript與HTML之間的交互是通過事件實現的。事件就是文檔或者瀏覽器中發生的一些特定的交互瞬間。
事件流事件流描述的是頁面接受事件的順序,而IE和Netscape的瀏覽器開發團隊提出了兩種截然不同的,甚至是完全相反的事件流概念。IE的事件流是事件冒泡,而Netscape的事件流是事件捕獲。
事件冒泡即事件開始時又最具體的元素接受,然后逐級向上傳播,現代的所有瀏覽器都支持事件冒泡,但是在具體實現上還是有些差別的,IE5.5及更早的版本中事件冒泡會跳過元素(從
直接到document)。而IE9, Firefox,Chrome,Safari則將事件一直冒泡到window對象。 事件捕獲事件捕獲的用意在于事件到達預定目標之前就捕獲它,在事件捕獲過程中,document對象先接受到click事件,然后事件沿著DOM樹依次向下,一直傳播到事件的具體目標。
DOM事件流DOM2級事件(關于Dom0 Dom2 Dom3請參考這里)規定的事件流包括三個階段:事件捕獲階段,處于目標階段,和事件冒泡階段。在Dom事件流中,實際的目標元素在捕獲階段是不會接受事件的,這意味著在捕獲階段,事件從document到再到
后就停止了。下一個階段是“處于目標”階段,于是事件在事件就是用戶或者瀏覽器執行的某個動作,例如click,load,mouseover都是事件的名字。而相應某個事件的函數叫做事件處理程序。事件處理程序的名字以on開頭,例如onclick,onload。
HTML事件處理程序每個元素支持的每種事件,都可以使用一個與響應事件處理程序同名的HTML特性來制定,這個特性的值應該是能夠執行的HTML代碼。
Dom0級事件處理程序通過JavaScript指定事件處理程序的傳統方式,就是將一個函數賦值給一個事件處理程序屬性。
var btn = document.getElementById("btn") btn.onclick = function() { alert("clicked") }
使用Dom0級事件處理程序被認為是元素的方法,此時程序中的this會引用當前元素。同時以這種方式添加的事件處理程序會在冒泡階段被處理。
Dom2級事件處理程序Dom2級事件定義了兩個方法,addEventListener()和removeEventListener(),所有的Dom節點中都包含著兩個方法,它們都是接受三個參數,要處理的事件名,事件處理函數,和一個布爾值(為true的時候表示在捕獲階段調用事件處理程序,false表示在冒泡階段調用事件處理程序)
var btn = document.getElementById("btn") btn.addEventListener("click", function(){ alert(this.value) }, false)IE事件處理程序
IE中實現了與DOM中類似的兩個方法,attachEvent()和detachEvent()。這兩個方法接受相同的參數,事件處理程序名稱,事件處理程序函數,由于在IE8以前不支持事件冒泡,所以事件處理程序函數會在冒泡階段執行。
var btn = document.getElementById("btn") btn.attachEvent("ocClick", function() { alert("clicked") })
此時在事件處理程序函數會在全局作用域中執行,也就是說此事的this是window。
同時如果為同一個元素同時添加了兩個不同的事件處理程序,這些事件處理程序并不是順序執行的而是以相反的順序被觸發。
在觸發Dom上的某個事件的時候,會產生一個事件對象event,這個對象包含著與事件有關的信息。
Dom事件對象兼容Dom的瀏覽器會將一個event對象傳到事件處理程序中。
var btn = document.getElementById("btn") btn.onclick = function(event) { alert(event.type) }
當我們想要阻止某個事件的特定行為時可以使用event對象的preventDefault()方法,而stopPropagation()方法則用于立即停止事件在DOM中的傳播,即取消進一步的事件冒泡或者捕獲。
IE中的事件對象要訪問IE中的event對象有幾種不同的方式,在使用DOM0級方法添加事件處理程序時,event對象作為window對像的一個屬性存在。
var btn = document.getElementById("btn") btn.onclick = function() { var event = window.event alert(event.type) }
但是當我們用attachEvent的方式添加的,此時的event對象會被當作一個參數傳入事件處理程序中。當時此時也可以通過window對象來訪問event對象。
在event對象中有一個srcElement屬性,指向事件的目標對象,因為事件的處理程序的作用域是根據指定它的方式來確定的,所以this并不總是等于目標對象。此時為了保險起見,建議使用srcElement
btn.onclick = function() { alert(window.event.srcElement) === this; //ture } btn.attachEvent("onclick", function(event) { alert(event.srcElement === this); //false })事件類型
Web瀏覽器中可能發生的事件類型有很多,不同的事件類型可能具有不同的信息。而DOM3級事件規定了一下幾類事件。
UI事件
UI事件指的是那些不一定與用戶操作有關的事件。比如load事件,當頁面完全加載后在window上面觸發,當圖片加載完畢在元素上觸發。以及腳本加載完畢在