Open Adamwu1992 opened 6 years ago
利用事件的冒泡机制,将事件处理方法绑定在父节点上,当事件冒泡到父节点时,根据target属性判断点击是否命中目标,如果命中就执行处理方法,否则判断target的父节点是否命中,直到遍历到父节点或者跟节点。
const isSelectedCurry = selector => {
const _selector = selector.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
if (_selector.match(/^\./)) {
return target => target.className.indexOf(_selector.substring(1)) > -1;
} else if (_selector.match(/^#/)) {
return target => target.id === _selector.substring(1);
} else {
return target => target.tagName === _selector.toUpperCase();
}
}
Element.prototype.myDelegate = function(type, targetSelector, callabck) {
const bindingEl = this;
const isSelected = isSelectedCurry(targetSelector);
bindingEl.addEventListener(type, event => {
let t = event.target;
while(!isSelected(t)) {
t = t.parentNode;
if (t === bindingEl || !t) {
t = null;
break;
}
}
if (t) {
callabck.call(t, event);
}
})
}
0级DOM事件
每一个DOM对象都有对应事件的一个属性,比如click事件对应的DOM属性就是onclick,通过为这个属性赋值可以绑定这个元素的点击处理事件,但是只能绑定一个事件。
或者
DOM0事件绑定迅速,并且会在DOM2事件之前触发。
2级DOM事件
DOM2为事件制定了3个阶段
执行顺序
通常来讲,首先执行捕获阶段的事件,再执行处于目标阶段的事件,最后执行冒泡阶段的事件。这个与绑定的时机无关,取决于事件流的流动。 但是,有一种情况就是如果处于目标阶段(
event.target === event.currentTarget
),无论事件绑定在捕获阶段还是冒泡阶段都会被无视掉,而是按照绑定的先后顺序执行。当前对象
event.target
表示触发该事件的节点,event.currentTarget
表示正在处理该事件的节点,可能是target
,也可能是target
的父节点在捕获或者冒泡阶段绑定触发了事件。 事件回调函数里的this
不一定指向当前节点对象,用currentTarget
可以准确获取到当前节点对象。