Skip to content

Instantly share code, notes, and snippets.

@kaaes
Created May 20, 2012 22:22
Show Gist options
  • Save kaaes/2759748 to your computer and use it in GitHub Desktop.
Save kaaes/2759748 to your computer and use it in GitHub Desktop.
Function to delegate events. Can be used with any css selector
function delegate(element, eventType, selector, callback, bubble) {
var selectorObj = getSelectorType(selector);
var callbackFn;
selector = selectorObj.value;
switch (selectorObj.type) {
case 'tag':
callbackFn = tagSelector;
break;
case 'class':
callbackFn = classSelector;
break;
default:
callbackFn = anySelector;
break;
}
function getSelectorType(selector) {
selector = selector.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
if (/^[a-z]+$/i.test(selector)) {
return {
type: 'tag',
value: selector
};
} else if (/^\.[a-z]+$/.test(selector)) {
return {
type: 'class',
value: selector.replace('.', '')
};
} else {
return {
type: 'other',
value: selector
}
}
}
function tagSelector(evt) {
var el = evt.target;
while (el !== evt.currentTarget) {
if (el.nodeName.toLowerCase() === selector) {
callback.call(el, evt);
return;
} else {
el = el.parentNode;
}
}
}
function classSelector(evt) {
var el = evt.target;
while (el !== evt.currentTarget) {
if (el.classList.contains(selector)) {
callback.call(el, evt);
return;
} else {
el = el.parentNode;
}
}
}
function anySelector(evt) {
var el = evt.target;
var currentEl;
var targets = element.querySelectorAll(selector);
while (el !== evt.currentTarget) {
currentEl = elementInList(targets, el);
if (currentEl) {
callback.call(currentEl, evt);
return;
} else {
el = el.parentNode;
}
}
}
function elementInList(list, element) {
for (var i = 0, l = list.length; i < l; i++) {
if (element === list[i]) {
return list[i];
}
}
return false;
}
element.addEventListener(eventType, callbackFn, typeof bubble === undefined ? false : bubble);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment