Skip to content

Instantly share code, notes, and snippets.

@subhaze
Created September 4, 2012 01:44
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save subhaze/3615652 to your computer and use it in GitHub Desktop.
Save subhaze/3615652 to your computer and use it in GitHub Desktop.
Vanilla event delegation
var delegate = (function(){
var match = (function(){
var guineaPig = document.createElement('div');
if(guineaPig.matchesSelector) return function(elem, selector){
return elem.matchesSelector(selector);
};
if(guineaPig.mozMatchesSelector) return function(elem, selector){
return elem.mozMatchesSelector(selector);
};
if(guineaPig.webkitMatchesSelector) return function(elem, selector){
return elem.webkitMatchesSelector(selector);
};
return function(elem, selector, elems){
for(var i=0,len=elems.length; i < len; i++){
if(elems[i] === elem) return true;
}
return false;
};
})();
return function(baseElement, event, selector, callback){
var on = 'addEventListener';
if(!baseElement.addEventListener){
event = 'on'+event;
on = 'attachEvent';
}
baseElement[on](event, function(e){
var _elems;
var target = e.target || e.srcElement;
if(!baseElement.mozMatchesSelector || !baseElement.webkitMatchesSelector){
_elems = baseElement.querySelectorAll(selector);
}
if(match(target, selector, _elems)){
return callback.call(target, e);
}
if(target.parentNode){
var _parent = target;
while(_parent = _parent.parentNode){
if(match(_parent, selector, _elems)){
return callback.call(_parent, e);
}
}
}
});
};
})();
/** Example usage **/
delegate(document.body, 'click', 'li .link', function(e){
// do something, `this` should point to element that was matched...
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment