Lesson-8
事宜机制
在讲事宜机制之前呢,我们有一个很重要的东西要先讲,那就是怎样完成事宜托付(代办).
只要必须先邃晓了怎样完成一个事宜托付,我们才更好的去完成on和off.在我看来,on和off里最难完成的就是他的事宜托付.
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;
}
}
}
}
以上是我对全部托付的完成,当然在这只做了异常简朴的完成,没有对许多别的状况举行推断,也没有多个参数是不是捕获.
我们先拆解下剖析.
function filiter(agent,selector,target) {
var nodes = agent.querySelectorAll(selector);
for (var i = 0; i < nodes.length; i++) {
if (nodes[i] == target) {
return true;
}
}
}
先看这个要领,这实在就是一个元素过滤,作用就是为了过滤出我们托付的元素详细是谁.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);
然后是我们的重要部份.实在这里就很简朴,while的前提推断两个,第一个是是不是阻挠冒泡,第二个推断是冒泡是不是到顶.
接着我们举行filiter举行过滤,假如返回true,则是我们的托付元素,直接call即可.
假如不做过量的兼容处置惩罚,完成一个托付照样比较轻易的.
PS:假如您照样不太邃晓,可以来这看更详细的诠释.http://www.meckodo.com/?p=309
您的star是磨练代码的唯一标准!:)
github地点: https://github.com/MeCKodo/forchange/tree/master/lesson-8
可想完成一个本身的简朴jQuery库?(八):http://segmentfault.com/a/1190000004025152