| var closest = require('./closest'); |
| |
| /** |
| * Delegates event to a selector. |
| * |
| * @param {Element} element |
| * @param {String} selector |
| * @param {String} type |
| * @param {Function} callback |
| * @param {Boolean} useCapture |
| * @return {Object} |
| */ |
| function delegate(element, selector, type, callback, useCapture) { |
| var listenerFn = listener.apply(this, arguments); |
| |
| element.addEventListener(type, listenerFn, useCapture); |
| |
| return { |
| destroy: function() { |
| element.removeEventListener(type, listenerFn, useCapture); |
| } |
| } |
| } |
| |
| /** |
| * Finds closest match and invokes callback. |
| * |
| * @param {Element} element |
| * @param {String} selector |
| * @param {String} type |
| * @param {Function} callback |
| * @return {Function} |
| */ |
| function listener(element, selector, type, callback) { |
| return function(e) { |
| e.delegateTarget = closest(e.target, selector); |
| |
| if (e.delegateTarget) { |
| callback.call(element, e); |
| } |
| } |
| } |
| |
| module.exports = delegate; |