摘要:實(shí)現(xiàn)的事件委托我們能根據(jù)之前的思路利用同樣的方法實(shí)現(xiàn)一個(gè)事件委托先來(lái)看看流程圖然后先看看結(jié)果是如何,畢竟流程圖看的也不一定能懂。通過(guò)在里查找對(duì)應(yīng)的事件數(shù)組,循環(huán)執(zhí)行即可以上就是整個(gè)委托的過(guò)程地址可想實(shí)現(xiàn)一個(gè)自己的簡(jiǎn)單庫(kù)十
Lesson-10
實(shí)現(xiàn)on,off的事件委托!
我們能根據(jù)之前的思路,利用同樣的方法實(shí)現(xiàn)一個(gè)事件委托.
先來(lái)看看流程圖
然后先看看結(jié)果是如何,畢竟流程圖看的也不一定能懂。
最后我們?cè)賮?lái)看看代碼
Kodo.deleEvents = []; //事件委托存放的事件 Kodo.deleId = 0; //事件委托的唯一標(biāo)識(shí) on: function(type, selector, fn) { if (typeof selector == "function") { fn = selector; //兩個(gè)參數(shù)的情況 //事件綁定過(guò)程 } else { //事件委托過(guò)程 for (var i = 0; i < this.length; i++) { if ( !this[i].deleId ) { this[i].deleId = ++Kodo.deleId; //同樣是判斷是否有唯一id Kodo.deleEvents[Kodo.deleId] = {}; //沒(méi)有則創(chuàng)建id對(duì)象 也就是f.deleEvents[]新開辟一個(gè)新對(duì)象 Kodo.deleEvents[Kodo.deleId][selector] = {}; //構(gòu)造 selector對(duì)象 /* * 如 Kodo.deleEvents[1] = * { * "#box li" : {}, * "#pox" : {} * } */ Kodo.deleEvents[Kodo.deleId][selector][type] = [fn]; //構(gòu)造我們的事件數(shù)組 /* * 如 Kodo.deleEvents["#box li"] = * { * "click" : [fn1,fn2...], * "touchstart" : [fn1,fn2....] * } */ delegate(this[i],type,selector); //用委托的方式進(jìn)行綁定 } else { //如果id存在的情況 var id = this[i].deleId, position = Kodo.deleEvents[id];//委托元素的事件存儲(chǔ)位置 if(!position[selector]) { //先判斷如果selector存儲(chǔ)的對(duì)象不存在 position[selector] = {}; //新建selector對(duì)象 (與上面的selector構(gòu)造相同) position[selector][type] = [fn]; //構(gòu)造事件數(shù)組對(duì)象 (與上面的type構(gòu)造相同) delegate(this[i],type,selector); //因?yàn)槭切碌膕elector 所以要再綁定 } else { //selector 存儲(chǔ)對(duì)象存在的情況 if ( position[selector][type] ) { //如果事件數(shù)組已經(jīng)有了,則直接push進(jìn)來(lái) position[selector][type].push(fn); } else { //如果事件數(shù)組沒(méi)有,那就構(gòu)造事件數(shù)組 position[selector][type] = [fn]; //因?yàn)槭切碌慕壎ǖ氖录?,所以要重新綁? delegate(this[i],type,selector); } } } } } },
繼續(xù)再看一遍log的結(jié)果,對(duì)比剛剛的代碼
連同代碼,我在注釋里已經(jīng)非常的詳細(xì)解釋了整個(gè)過(guò)程,大家結(jié)合控制臺(tái)log的結(jié)果,在看看最初的流程圖結(jié)合的看,我相信有點(diǎn)點(diǎn)耐心就能馬上理解了。
綁定過(guò)程都會(huì)比較復(fù)雜,理解了綁定過(guò)程后,下面off的實(shí)現(xiàn)就很容易了。
off本身是可以傳2個(gè)參數(shù)的,第一個(gè)參數(shù)為事件type,第二個(gè)參數(shù)是委托元素selector
off: function(type, selector) { if (arguments.length == 0) { //如果沒(méi)傳參數(shù),清空所有事件 } else if (arguments.length == 1) { //指定一個(gè)參數(shù),則清空對(duì)應(yīng)的事件 } else { //直接根據(jù)dom上存有的deleId,找到對(duì)應(yīng)的deleEvents里的位置 //刪除委托元素上的type事件數(shù)組即可 for (var i = 0; i < this.length; i++) { var id = this[i].deleId; delete Kodo.deleEvents[id][selector][type]; } } }
最后看看我們修改過(guò)后的 delegate方法
function delegate(agent, type, selector) { var id = agent.deleId; //先獲取被委托元素的deleId agent.addEventListener(type, function(e) { var target = e.target; var ctarget = e.currentTarget; var bubble = true; while (bubble && target != ctarget) { if (filiter(agent, selector, target)) { for (var i = 0; i < Kodo.deleEvents[id][selector][type].length; i++) { bubble = Kodo.deleEvents[id][selector][type][i].call(target, e); //循環(huán)事件數(shù)組 直接call } } target = target.parentNode; return bubble; } }, false); function filiter(agent, selector, target) { //過(guò)濾函數(shù) } }
這里修改的就只有二個(gè)地方
1.獲取被委托元素的deleId,因?yàn)槲覀冋麄€(gè)委托機(jī)制都與他有關(guān)。
2.通過(guò)id在deleEvents里查找對(duì)應(yīng)的事件數(shù)組,循環(huán)執(zhí)行即可
以上就是整個(gè)委托的過(guò)程!
f("you").on("star","me",function(){ console.log("success!"); });
github地址: https://github.com/MeCKodo/forchange/tree/master/lessonn-10
可想實(shí)現(xiàn)一個(gè)自己的簡(jiǎn)單jQuery庫(kù)?(十):http://segmentfault.com/a/1190000004028779
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78185.html
摘要:事件機(jī)制在講事件機(jī)制之前呢我們有一個(gè)很重要的東西要先講那就是如何實(shí)現(xiàn)事件委托代理只有必須先明白了如何實(shí)現(xiàn)一個(gè)事件委托我們才能更好的去實(shí)現(xiàn)和在我看來(lái)和里最難實(shí)現(xiàn)的就是他的事件委托以上是我對(duì)整個(gè)委托的實(shí)現(xiàn)當(dāng)然在這只做了非常簡(jiǎn)單的實(shí)現(xiàn)沒(méi)有對(duì)很多 Lesson-8 事件機(jī)制 在講事件機(jī)制之前呢,我們有一個(gè)很重要的東西要先講,那就是如何實(shí)現(xiàn)事件委托(代理). 只有必須先明白了如何實(shí)現(xiàn)一個(gè)事件委...
摘要:事件機(jī)制在講事件機(jī)制之前呢我們有一個(gè)很重要的東西要先講那就是如何實(shí)現(xiàn)事件委托代理只有必須先明白了如何實(shí)現(xiàn)一個(gè)事件委托我們才能更好的去實(shí)現(xiàn)和在我看來(lái)和里最難實(shí)現(xiàn)的就是他的事件委托以上是我對(duì)整個(gè)委托的實(shí)現(xiàn)當(dāng)然在這只做了非常簡(jiǎn)單的實(shí)現(xiàn)沒(méi)有對(duì)很多 Lesson-8 事件機(jī)制 在講事件機(jī)制之前呢,我們有一個(gè)很重要的東西要先講,那就是如何實(shí)現(xiàn)事件委托(代理). 只有必須先明白了如何實(shí)現(xiàn)一個(gè)事件委...
摘要:而事件委托的概念事件目標(biāo)自身不處理事件,而是將其委托給父元素或祖先元素或根元素,而借助事件的冒泡性質(zhì)由內(nèi)向外來(lái)達(dá)到最終處理事件。而且一旦出現(xiàn),局部刷新導(dǎo)致重新綁定事件。函數(shù)的用法,代表要移除的事件,表示選擇的,表示事件處理函數(shù)。 歡迎來(lái)我的專欄查看系列文章。 這次的內(nèi)容是來(lái)介紹關(guān)于 jQuery 的事件委托。不過(guò)在之前呢有必要先來(lái)了解一下 JS 中的事件委托與冒泡,我之前也寫過(guò)類似的博...
閱讀 705·2023-04-25 22:50
閱讀 1535·2021-10-08 10:05
閱讀 988·2021-09-30 09:47
閱讀 1924·2021-09-28 09:35
閱讀 827·2021-09-26 09:55
閱讀 3420·2021-09-10 10:51
閱讀 3433·2021-09-02 15:15
閱讀 3300·2021-08-05 09:57