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