第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

章節(jié)
問答
課簽
筆記
評(píng)論
占位
占位

Special Event機(jī)制

在事件處理中,很多地方都用到了這個(gè) jQuery.event.special 方法,special 是一個(gè)在處理特殊的事件相當(dāng)靈活,可以指定綁定和解開鉤子以及定制事件的默認(rèn)行為,用這個(gè) API 的時(shí)候可以創(chuàng)建自定義的事件但不僅僅是執(zhí)行綁定事件處理程序時(shí),引發(fā)這些“特殊”事件可以修改事件對(duì)象傳遞給事件處理程序,引發(fā)其他完全不同的事件,或者執(zhí)行復(fù)雜的 setup 和 teardown 代碼當(dāng)事件處理程序綁定到或未綁定元素。

某些事件類型的有特殊行為和屬性,換句話說就是某些事件不是大眾化的事件不能一概處理。

比如 load 事件擁有特殊的 noBubble 屬性,可以防止該事件的冒泡而引發(fā)一些錯(cuò)誤,所以需要單獨(dú)針的處理,但是如果都寫成判斷的形式,顯然代碼結(jié)構(gòu)就不合理了,而且不方便提供給用戶自定義擴(kuò)展。有些瀏覽器并不兼容某類型的事件,如 IE6~8 不支持 hashchange 事件,你無法通過 jQuery(window).bind('hashchange', callback) 來綁定這個(gè)事件,這個(gè)時(shí)候你就可以通過 jQuery 自定義事件接口來模擬這個(gè)事件,做到跨瀏覽器兼容。這個(gè)就是 special 的作用了,又有點(diǎn)類似之前說的鉤子機(jī)制了。

原理

jQuery(elem).bind(type, callbakc) 實(shí)際上是映射到 jQuery.event.add(elem, types, handler, data) 這個(gè)方法,每一個(gè)類型的事件會(huì)初始化一次事件處理器,而傳入的回調(diào)函數(shù)會(huì)以數(shù)組的方式緩存起來,當(dāng)事件觸發(fā)的時(shí)候,處理器將依次執(zhí)行這個(gè)數(shù)組。

jQuery.event.add 方法在第一次初始化處理器的時(shí)候,會(huì)檢查是否為自定義事件,如果存在則將會(huì)把控制權(quán)限交給自定義事件的事件初始化函數(shù),同樣事件卸載的 jQuery.event.remove 方法在刪除處理器前也會(huì)檢查此處。

初始化處事件處理器

if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
   if (elem.addEventListener) {
      elem.addEventListener(type, eventHandle, false);
   }
}

卸載自定義事件

if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
    jQuery.removeEvent(elem, type, elemData.handle);
}

jQuery.event.special 對(duì)象中,保存著為適配特定事件所需的變量和方法。

beforeunload: Object
blur: Object
click: Object
focus: Object
focusin: Object
focusout: Object
load: Object
mouseenter: Object
mouseleave: Object
pointerenter: Object
pointerleave: Object

事實(shí)上 jQuery 自定義事件那些接收的參數(shù)有點(diǎn)雞肋,需要 hack 與能 hack 的事件就那么一點(diǎn)點(diǎn),且限制頗多,一般情況下很少使用到。

得出總結(jié):

在 jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :

方法中沒有傳遞回調(diào)對(duì)象是因?yàn)榛卣{(diào)的句柄被關(guān)聯(lián)到了 elemData,也就是內(nèi)部數(shù)據(jù)緩存中了,不難得出 jQuery 的事件綁定機(jī)制:jQuery 對(duì)每一個(gè) elem 中的每一種事件,只會(huì)綁定一次事件處理函數(shù)(綁定這個(gè)elemData.handle),而這個(gè) elemData.handle 實(shí)際只做一件事,就是把 event 丟到 jQuery 內(nèi)部的事件分發(fā)程序。

jQuery.event.dispatch.apply( eventHandle.elem, arguments );

而不同的事件綁定,具體是由 jQuery 內(nèi)部維護(hù)的事件列隊(duì)來區(qū)分(就是那個(gè) elemData.events),在 elemData 中獲取到 events 和 handle 之后,接下來就需要知道這次綁定的是什么事件了。

任務(wù)

?不會(huì)了怎么辦
||

提問題

寫筆記

公開筆記
提交
||

請(qǐng)驗(yàn)證,完成請(qǐng)求

由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求

加群二維碼

打開微信掃碼自動(dòng)綁定

您還未綁定服務(wù)號(hào)

綁定后可得到

  • · 粉絲專屬優(yōu)惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復(fù)提醒
  • · 賬號(hào)支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請(qǐng)您關(guān)注公眾號(hào)
關(guān)注后,及時(shí)獲悉本課程動(dòng)態(tài)

舉報(bào)

0/150
提交
取消
全部 精華 我要發(fā)布
全部 我要發(fā)布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費(fèi)2個(gè)積分

你的積分不足,無法發(fā)表

為什么扣積分?

本次提問將花費(fèi)2個(gè)積分

繼續(xù)發(fā)表請(qǐng)點(diǎn)擊 "確定"

為什么扣積分?