摘要:深入理解事件機(jī)制一事件流事件就是當(dāng)用戶或者瀏覽器自身執(zhí)行的某種動作,諸如等都是事件的名稱,那響應(yīng)個事件的函數(shù)就稱為事件處理程序事件處理函數(shù)事件句柄。
深入理解js Dom事件機(jī)制(一)——事件流
事件就是當(dāng)用戶或者瀏覽器自身執(zhí)行的某種動作,諸如 click、mouseover等都是事件的名稱,那響應(yīng)個事件的函數(shù)就稱為事件處理程序(事件處理函數(shù)、事件句柄)。 事件處理程序的名字都是以on+事件名稱命名,比如 click事件的事件處理程序就是onclick, 為某個事件指定事件處理程序的方式大致分為三種。1、HTML事件處理程序
這個很簡單,大家基本初學(xué)js的時候都應(yīng)該用過,就不再贅述,直接看實(shí)例代碼
Html事件處理程序
以上代碼展示了兩種html指定事件處理程序的方法,需要注意的是 第一種做法的this指向的是元素本身, 所以我們可以很容易的訪問元素本身的屬性,而第二種做法的this指向的window對象。
缺點(diǎn):
存在時差問題,當(dāng)用戶在元素出現(xiàn)在頁面就觸發(fā)事件,但有可能這個時候事件處理程序不具備執(zhí)行的條件。
html與js代碼耦合度高,這正是很多開發(fā)者放棄html事件處理程序的原因。
2、DOM0級事件處理程序這種方式首先需要取得一個dom元素對象的應(yīng)用,然后將一個函數(shù)賦值給一個事件處理程序,這種方式在第四代瀏覽器中就已經(jīng)出現(xiàn),至今仍然為現(xiàn)在瀏覽器所支持,原因一是簡單,二是具有跨瀏覽器的優(yōu)勢。
DOMO級事件處理程序
通過上面的代碼可以看出,這種方法指定的事件處理程序中this是指向元素本身。相對應(yīng)的這種方法也可以刪除指定的事件處理程序: btn.onclick = null.3、DOM2級事件處理程序
DOM2級事件定義了兩個方法,用于處理指定和刪除事件處理程序的操作:addEventListener()、removeEventListener(),它們都接受三個參數(shù):要處理的事件名、事件處理函數(shù)、布爾值(true:在捕獲階段調(diào)用事件處理函數(shù),false:在冒泡階段調(diào)用事件處理函數(shù))。
DOM2級事件處理程序
從上述代碼中可以看出:
addEventListener可以對一個元素添加多個事件處理程序,并可以聲明是將事件處理程序添加到哪一個階段(為了保證兼容性、建議都將事件處理程序添加到冒泡階段)。
需要特別注意的是:removeEventListener移除事件處理函數(shù)的時候,傳入的事件事件處理函數(shù)必須和addEventListener傳入的相同,方可移除,這就意味著如果addEventListener中使用了一個匿名函數(shù)來作為事件處理函數(shù),那么removeEventListener將無法移除。
4、IE事件處理程序(IE8 && IE8 - && Opera)IE實(shí)現(xiàn)了類似DOM中的兩個方法:attacheEvent()、detachEvent(),它們接受兩個參數(shù):事件處理程序名稱、事件處理函數(shù)。由于IE8以及更早的瀏覽器只支持冒泡事件流,所以通過attacheEvent()添加的事件處理程序都將在會被添加到冒泡階段。
IE事件處理程序
與DOM2級方法的異同
相同:
1、都可以添加和移除事件處理程序,匿名函數(shù)均不可移除。 2、都可以添加多個事件處理程序。
不同:
1、IE的事件處理函數(shù)會在全局作用于執(zhí)行,所以this指向window,而DOM方法中this指向元素對象引用 2、當(dāng)添加多個事件處理程序時:執(zhí)行的順序和DOM2級事件處理程序相反。5、跨瀏覽器事件處理程序
為了保證事件處理的代碼能在大部分的瀏覽器下得到一致性的運(yùn)行,我們可以恰當(dāng)?shù)氖褂脼g覽器能力檢測能力封裝一個通用的事件處理程序添加函數(shù)。
let eventUtil = { addEventHandle(element, eventType, handle) { if (Object.prototype.toString.apply(handle) !== "[object Function]") { throw new TypeError("handle invaild") } if (!element.addEventListener) { element.addEventListener(eventType,handle) } else if (element.attachEvent) { element.attachEvent(`on${eventType}`,handle) } else{ element[`on${eventType}`] = handle } }, removeEventHandle(element, eventType, handle) { if (Object.prototype.toString.apply(handle) !== "[object Function]") { throw new TypeError("handle invaild") } if (!element.removeEventListener) { element.removeEventListener(eventType,handle) } else if (element.detachEvent) { element.detachEvent(`on${eventType}`,handle) } else{ element[`on${eventType}`] = null } } }
上面的代碼很簡單,首先判斷瀏覽器是否支持addEventHandle, 如果支持就用它來添加事件程序,否則再判斷attachEvent,如果還不支持只能用Dom0級事件添加, 但是針對IE8--使用attachEvent添加事件處理程序時,this的指向并沒有做處理,包括事件觸發(fā)的階段等。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89819.html
摘要:深入理解事件機(jī)制一事件流事件就是當(dāng)用戶或者瀏覽器自身執(zhí)行的某種動作,諸如等都是事件的名稱,那響應(yīng)個事件的函數(shù)就稱為事件處理程序事件處理函數(shù)事件句柄。 深入理解js Dom事件機(jī)制(一)——事件流 事件就是當(dāng)用戶或者瀏覽器自身執(zhí)行的某種動作,諸如 click、mouseover等都是事件的名稱,那響應(yīng)個事件的函數(shù)就稱為事件處理程序(事件處理函數(shù)、事件句柄)。 事件處理程序的名字都是以on...
摘要:圖片轉(zhuǎn)引自的演講和兩個定時器中回調(diào)的執(zhí)行邏輯便是典型的機(jī)制。異步編程關(guān)于異步編程我的理解是,在執(zhí)行環(huán)境所提供的異步機(jī)制之上,在應(yīng)用編碼層面上實(shí)現(xiàn)整體流程控制的異步風(fēng)格。 問題背景 在一次開發(fā)任務(wù)中,需要實(shí)現(xiàn)如下一個餅狀圖動畫,基于canvas進(jìn)行繪圖,但由于對于JS運(yùn)行環(huán)境中異步機(jī)制的不了解,所以遇到了一個棘手的問題,始終無法解決,之后在與同事交流之后才恍然大悟。問題的根節(jié)在于經(jīng)典的J...
摘要:事件捕獲提出的事件流模型稱為事件捕獲。事件代理則是一種簡單有效的技巧,通過它可以把事件處理器添加到一個父級元素上,從而避免把事件處理器添加到多個子級元素上。更新無需重新綁定事件處理器,因?yàn)槭录韺Σ煌釉乜刹捎貌煌幚矸椒ā? 首先我們思考一個很有意思的事情:一張紙上畫了兩個同心圓,當(dāng)我們把手指放到圓心上時,手指指向的不是一個圓,而是紙上的兩個圓,同理之,當(dāng)我們單擊網(wǎng)頁上的一個div...
摘要:當(dāng)這些異步任務(wù)發(fā)生的時候,它們將會被放入瀏覽器的事件任務(wù)隊(duì)列中去,等到運(yùn)行時執(zhí)行線程空閑時候才會按照隊(duì)列先進(jìn)先出的原則被一一執(zhí)行,但終究還是單線程。 瀏覽器是多進(jìn)程的 showImg(https://segmentfault.com/img/remote/1460000019706956?w=815&h=517); Browser進(jìn)程: 瀏覽器的主進(jìn)程(負(fù)責(zé)協(xié)調(diào)、主控),只有一個。 負(fù)...
摘要:當(dāng)這些異步任務(wù)發(fā)生的時候,它們將會被放入瀏覽器的事件任務(wù)隊(duì)列中去,等到運(yùn)行時執(zhí)行線程空閑時候才會按照隊(duì)列先進(jìn)先出的原則被一一執(zhí)行,但終究還是單線程。 瀏覽器是多進(jìn)程的 showImg(https://segmentfault.com/img/remote/1460000019706956?w=815&h=517); Browser進(jìn)程: 瀏覽器的主進(jìn)程(負(fù)責(zé)協(xié)調(diào)、主控),只有一個。 負(fù)...
閱讀 3002·2021-11-25 09:43
閱讀 3644·2021-08-31 09:41
閱讀 1259·2019-08-30 15:56
閱讀 2152·2019-08-30 15:55
閱讀 3015·2019-08-30 13:48
閱讀 2826·2019-08-29 15:15
閱讀 999·2019-08-29 15:14
閱讀 2667·2019-08-28 18:26