Open pfan123 opened 7 years ago
event.currentTarget,当事件遍历 DOM 时,识别事件的当前目标对象(Identifies the current target for the event, as the event traverses the DOM.)。 该属性总是指向被绑定事件句柄(event handler)的元素。而与之对比的event.target ,则是指向触发该事件的元素。
Element.matches(selectorString),selectorString 既是 CSS 那样的选择器规则,比如本例中可以使用 target.matches('li.class-1'),他会返回一个布尔值,如果 target 元素是标签 li 并且它的类是 class-1 ,那么就会返回 true,否则返回 false;
if (!Element.prototype.matches) { Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function(s) { var matches = (this.document || this.ownerDocument).querySelectorAll(s), i = matches.length; while (--i >= 0 && matches.item(i) !== this) {} return i > -1; }; } document.getElementById('list').addEventListener('click', function (e) { // 兼容性处理 var event = e || window.event; var target = event.target || event.srcElement; if (target.matches('li.class-1')) { console.log('the content is: ', target.innerHTML); } });
封装写法:
function eventDelegate (parentSelector, targetSelector, events, foo) { // 触发执行的函数 function triFunction (e) { // 兼容性处理 var event = e || window.event; // 获取到目标阶段指向的元素 var target = event.target || event.srcElement; // 获取到代理事件的函数 var currentTarget = event.currentTarget; // 处理 matches 的兼容性 if (!Element.prototype.matches) { Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function(s) { var matches = (this.document || this.ownerDocument).querySelectorAll(s), i = matches.length; while (--i >= 0 && matches.item(i) !== this) {} return i > -1; }; } // 遍历外层并且匹配 while (target !== currentTarget) { // 判断是否匹配到我们所需要的元素上 if (target.matches(targetSelector)) { var sTarget = target; // 执行绑定的函数,注意 this foo.call(sTarget, Array.prototype.slice.call(arguments)) } target = target.parentNode; } } // 如果有多个事件的话需要全部一一绑定事件 events.split('.').forEach(function (evt) { // 多个父层元素的话也需要一一绑定 Array.prototype.slice.call(document.querySelectorAll(parentSelector)).forEach(function ($p) { $p.addEventListener(evt, triFunction); }); }); }
JavaScript 事件委托详解 JavaScript 和事件
event.currentTarget与event.target区别
event.currentTarget,当事件遍历 DOM 时,识别事件的当前目标对象(Identifies the current target for the event, as the event traverses the DOM.)。 该属性总是指向被绑定事件句柄(event handler)的元素。而与之对比的event.target ,则是指向触发该事件的元素。
Element.matches API 的基本使用方法:
Element.matches(selectorString),selectorString 既是 CSS 那样的选择器规则,比如本例中可以使用 target.matches('li.class-1'),他会返回一个布尔值,如果 target 元素是标签 li 并且它的类是 class-1 ,那么就会返回 true,否则返回 false;
封装写法:
JavaScript 事件委托详解 JavaScript 和事件