Skip to content

Instantly share code, notes, and snippets.

@Spikus
Last active November 1, 2017 13:49
Show Gist options
  • Select an option

  • Save Spikus/b420f49e8e5d1f8f40c630a1c89139d1 to your computer and use it in GitHub Desktop.

Select an option

Save Spikus/b420f49e8e5d1f8f40c630a1c89139d1 to your computer and use it in GitHub Desktop.
ZoneEventDelegate
class EventDelegate {
constructor() {
this.events = {};
window.eventDelegate = this;
}
addEvent(newEvent, eventSelector, handle) {
this.createEvent(newEvent);
if (!this.events[newEvent][eventSelector]) {
this.events[newEvent][eventSelector] = [];
}
if (this.events[newEvent][eventSelector].indexOf(handle) < 0) {
this.events[newEvent][eventSelector].push(handle);
}
}
debugInfo() {
console.log(this.events);
}
createEvent(event) {
if (!this.events[event]) {
this.events[event] = {};
this.bindEvent(event);
}
}
bindEvent(event) {
document.addEventListener(event, this.eventBubbling.bind(this));
}
selectorMatches(el, selector) {
//use prototype for matches
var p = Element.prototype;
var f = p.matches || p.webkitMatchesSelector || p.mozMatchesSelector || p.msMatchesSelector || function (s) {
return Array.prototype.indexOf.call(document.querySelectorAll(s), this) !== -1;
};
return f.call(el, selector);
}
eventBubbling(event) {
let type = event.type;
if (!this.events[type]) {
return;
}
for (let elem = event.target; elem && elem !== document.body; elem = elem.parentNode) {
for (let selector in this.events[type]) {
if (this.selectorMatches(elem, selector)) {
this.runHandle(type, elem, selector, event);
}
}
};
}
runHandle(type, elem, selector, event) {
this.events[type][selector].map((handle)=>{
handle.call(elem, event);
});
}
}
export default EventDelegate;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment