Skip to content

Instantly share code, notes, and snippets.

@dgraham
Last active August 29, 2015 14:25
Show Gist options
  • Select an option

  • Save dgraham/bda6a30bd2ef4fdfb3a5 to your computer and use it in GitHub Desktop.

Select an option

Save dgraham/bda6a30bd2ef4fdfb3a5 to your computer and use it in GitHub Desktop.
Simple delegated event handling.
(function() {
const events = new Map();
const stopped = new WeakMap();
function before(subject, verb, fn) {
const source = subject[verb];
subject[verb] = function() {
fn.apply(subject, arguments);
return source.apply(subject, arguments);
};
return subject;
}
function dispatch(observers, event) {
before(event, 'stopImmediatePropagation', stopped.set.bind(stopped, event));
const matches = observers.matches(event.target);
for (var i = 0, length = matches.length; i < length; i++) {
if (stopped.has(event)) break;
matches[i].data.call(event.target, event);
}
}
this.on = function(name, selector, fn) {
var observers = events.get(name);
if (!observers) {
observers = new SelectorSet();
events.set(name, observers);
document.addEventListener(name, dispatch.bind(null, observers), false);
}
observers.add(selector, fn);
};
this.off = function(name, selector, fn) {
const observers = events.get(name);
if (observers) {
observers.remove(selector, fn);
}
};
this.fire = function(target, name, detail) {
return target.dispatchEvent(
new CustomEvent(name, {
bubbles: true,
cancelable: true,
detail: detail
})
);
};
}).call($);
$.on('click', '.js-toggle-lang-stats', function(event) {
document.querySelector('.js-stats-switcher-viewport').classList.toggle('is-revealing-lang-stats');
event.preventDefault();
});
$.fire(document.body, 'validation:change', {id: 42, login: 'hubot'});
@josh
Copy link
Copy Markdown

josh commented Jul 21, 2015

Years off, but I'd expect to see an official replacement for addEventListener someday. Some ideas standards people are talking about.

http://www.xanthir.com/b4PV0
https://github.com/zenparsing/es-observable

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment