var MATCHES_SELECTOR = [ 'webkitMatchesSelector', 'mozMatchesSelector', 'matchesSelector' ].filter(function(name){ return this[name]; }, doc.body)[0]; var TPL_CARD = '
{{contents}}
'; var clickEvents = { '.card, .card *': function(){ var sender = this; } }; delegate(doc.body, 'click', clickEvents); function delegate(elm, subject, table){ var selectors = Object.keys(table); elm.addEventListener(subject, function(e){ var target = e.target; selectors.forEach(function(selector){ if (target[MATCHES_SELECTOR](selector)) { this[selector].call(target, e); } }, table); }); }