摘要:事件機(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è)事件委托,我們才能更好的去實(shí)現(xiàn)on和off.在我看來(lái),on和off里最難實(shí)現(xiàn)的就是他的事件委托.
function delegate(agent,type,selector,fn) { 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)) { bubble = fn.call(target,e); } target = target.parentNode; return bubble; } },false); function filiter(agent,selector,target) { var nodes = agent.querySelectorAll(selector); for (var i = 0; i < nodes.length; i++) { if (nodes[i] == target) { return true; } } } }
以上是我對(duì)整個(gè)委托的實(shí)現(xiàn),當(dāng)然在這只做了非常簡(jiǎn)單的實(shí)現(xiàn),沒(méi)有對(duì)很多別的情況進(jìn)行判斷,也沒(méi)有多個(gè)參數(shù)是否捕捉.
我們先拆解下分析.
function filiter(agent,selector,target) { var nodes = agent.querySelectorAll(selector); for (var i = 0; i < nodes.length; i++) { if (nodes[i] == target) { return true; } } }
先看這個(gè)方法,這其實(shí)就是一個(gè)元素過(guò)濾,作用就是為了過(guò)濾出我們委托的元素具體是誰(shuí).target就是我們具體的委托元素
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)) { bubble = fn.call(target,e); } target = target.parentNode; return bubble; } },false);
然后是我們的主要部分.其實(shí)這里就很簡(jiǎn)單,while的條件判斷兩個(gè),第一個(gè)是是否阻止冒泡,第二個(gè)判斷是冒泡是否到頂.
接著我們進(jìn)行filiter進(jìn)行過(guò)濾,如果返回true,則是我們的委托元素,直接call即可.
如果不做過(guò)多的兼容處理,實(shí)現(xiàn)一個(gè)委托還是比較容易的.
PS:如果您還是不太明白,可以來(lái)這看更具體的解釋.http://www.meckodo.com/?p=309
您的star是檢驗(yàn)代碼的唯一標(biāo)準(zhǔn)!:)
github地址: https://github.com/MeCKodo/forchange/tree/master/lesson-8
可想實(shí)現(xiàn)一個(gè)自己的簡(jiǎn)單jQuery庫(kù)?(八):http://segmentfault.com/a/1190000004025152
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/49651.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è)事件委...
摘要:這個(gè)版本新增這個(gè)選擇元素的方法還是比較常用的首先我們需要一個(gè)來(lái)過(guò)濾我們需要的上面那段比較簡(jiǎn)單就是普通的過(guò)濾下元素看下方法的源碼就知道我傳入數(shù)組對(duì)象的個(gè)對(duì)象然后取它的下一個(gè)同輩元素直接返回方法同理這段是取到第一個(gè)父元素由于返回的不是原生的對(duì) Lesson-2 這個(gè)版本新增 next(),prev(),parent(),parents() 這4個(gè)選擇元素的方法還是比較常用的 首先我們需要...
摘要:兼容性簡(jiǎn)直神器有木有所以我們寫(xiě)一個(gè)這樣的方法吧實(shí)現(xiàn)操作然后只需要傳對(duì)應(yīng)參數(shù)就好了如此簡(jiǎn)單接著是方法在這我只做刪除自身節(jié)點(diǎn)就沒(méi)繼續(xù)拓展了大家可以自行完善只能刪除自身您給予的就是給代碼賦予靈魂地址可想實(shí)現(xiàn)一個(gè)自己的簡(jiǎn)單庫(kù)七 Lesson-7 新增 html,append,before,after,remove html: function (value) { if (value ...
閱讀 2910·2021-10-14 09:42
閱讀 1257·2021-09-24 10:32
閱讀 2973·2021-09-23 11:21
閱讀 2852·2021-08-27 13:10
閱讀 3343·2019-08-29 18:41
閱讀 2206·2019-08-29 15:16
閱讀 1217·2019-08-29 13:17
閱讀 900·2019-08-29 11:22