JS自定義事件

2018年2月28日

背景

業(yè)務(wù)開發(fā)中遇到JS消息沒被成功接收的問題。順帶復(fù)習(xí)一下 JS 事件掀抹。

為實現(xiàn)不同模塊間的消息傳遞怜跑,我最初使用的是 jQuery triggeron色瘩。但不知何原因(猜測和模塊加載、打包有關(guān))碍拆,模塊間使用的并非是同一個 jQuery若治。也就是說消息隊列掛在了不同的 $ 下,故模塊間無法通信了感混。改為使用 CustomEvent 去傳遞消息端幼。

CustomEvent

var event = new  CustomEvent('eventName', { 'detail':data}); // 要傳遞的數(shù)據(jù),放在detail 里面 
Target.dispatchEvent(event);
Target.addEventListener('eventName', function(){...} );

事件流

事件是先經(jīng)過捕獲階段弧满,從上往下傳婆跑;再經(jīng)歷冒泡階段,從下往上傳庭呜。

addEventListener 默認(rèn)是在冒泡階段調(diào)用函數(shù)滑进,可添加第三參數(shù) true犀忱,讓事件在捕獲階段調(diào)用函數(shù)。

我一開始是使用 document 去發(fā)送和監(jiān)聽事件的扶关。但聯(lián)想到事件流阴汇,猜測是否子元素也可以監(jiān)聽這個document發(fā)出的事件?這里混淆了一點概念节槐。

什么才是真正的子類搀庶?

若要觸發(fā)的是 Target 容器,此時的 Target 就是“最子類了”铜异,雖然它自己還有的子類 “child”哥倔,但事件流和這個child是無關(guān)的。所以這里的 child 容器接收不到消息是正常的熙掺。

接著在測試中,遇到了另一個無關(guān)緊要的問題咕宿。

問題

當(dāng) addEventListener 使用“冒泡階段處理函數(shù)”時币绩,父容器接收不到消息了。

而若是使用“捕獲階段處理函數(shù)”府阀,則事件流正常缆镣。console結(jié)果如下:

在事件冒泡階段調(diào)用處理函數(shù)

elem.addEventListener('build', function (e) { ... });

Target get the message: HELLO

在事件捕獲階段調(diào)用處理函數(shù) elem.addEventListener('build', function (e) { ... }, true);

document get the message: HELLO
Parent get the message: HELLO
Target get the message: HELLO

原因

CustomEvent 默認(rèn)是把冒泡功能禁用了。 需要手動傳參去開啟:

var event = new CustomEvent('eventName', { 'detail':'HELLO', 'bubbles': true});

JS 事件模型

JS 事件本質(zhì)是觀察者模式(Publish/Subscribe)试浙。

膚淺地理解:

有一個全局變量董瞻;
每當(dāng) “on/listen/監(jiān)聽/注冊/訂閱” 一個事件時,就把對應(yīng)的 key(事件名)和 value(callback)存進(jìn)去田巴。
每當(dāng) “trigger/dispatch/發(fā)布” 時钠糊,就找到相應(yīng)的key(事件名),把對應(yīng)的value(數(shù)組)里的每一個 callback壹哺,都執(zhí)行一遍

但瀏覽器對此的實現(xiàn)更為復(fù)雜抄伍,它還得滿足一系列的規(guī)則(JS事件流):

比如:$(A).trigger( "event_1" )
那么只有 A 以及 A 的父類容器,才有資格入選管宵;
且這些入選者中截珍,要提前有 監(jiān)聽(on)了這個 "event_1" 事件;
且瀏覽器會根據(jù)指令(捕獲or冒泡)箩朴,選擇 callback 被調(diào)用的順序岗喉。

相關(guān)鏈接

  1. JS中事件冒泡與捕獲:https://segmentfault.com/a/1190000005654451
  2. CustomEvent:https://developer.mozilla.org/zh-CN/docs/Web/API/CustomEvent
  3. JS事件模型 : https://segmentfault.com/a/1190000006934031
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炸庞,隨后出現(xiàn)的幾起案子钱床,更是在濱河造成了極大的恐慌,老刑警劉巖埠居,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诞丽,死亡現(xiàn)場離奇詭異鲸拥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)僧免,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門刑赶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人懂衩,你說我怎么就攤上這事撞叨。” “怎么了浊洞?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵牵敷,是天一觀的道長。 經(jīng)常有香客問我法希,道長枷餐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任苫亦,我火速辦了婚禮毛肋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屋剑。我一直安慰自己润匙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布唉匾。 她就那樣靜靜地躺著孕讳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巍膘。 梳的紋絲不亂的頭發(fā)上厂财,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音峡懈,去河邊找鬼蟀苛。 笑死,一個胖子當(dāng)著我的面吹牛逮诲,可吹牛的內(nèi)容都是我干的帜平。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼梅鹦,長吁一口氣:“原來是場噩夢啊……” “哼裆甩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起齐唆,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嗤栓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茉帅,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡叨叙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了堪澎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擂错。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖樱蛤,靈堂內(nèi)的尸體忽然破棺而出钮呀,到底是詐尸還是另有隱情,我是刑警寧澤昨凡,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布爽醋,位于F島的核電站,受9級特大地震影響便脊,放射性物質(zhì)發(fā)生泄漏蚂四。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一哪痰、第九天 我趴在偏房一處隱蔽的房頂上張望遂赠。 院中可真熱鬧,春花似錦妒御、人聲如沸解愤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奸笤,卻和暖如春惋啃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背监右。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工边灭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人健盒。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓绒瘦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扣癣。 傳聞我的和親對象是個殘疾皇子惰帽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容