click-outside
Version:
The inverse of the DOM "click" event
81 lines (61 loc) • 1.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _map = require('babel-runtime/core-js/map');
var _map2 = _interopRequireDefault(_map);
exports.default = clickOutside;
var _componentEvent = require('component-event');
var _componentEvent2 = _interopRequireDefault(_componentEvent);
var _nodeContains = require('node-contains');
var _nodeContains2 = _interopRequireDefault(_nodeContains);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Hash of elements and callback functions.
*/
/**
* Module dependencies.
*/
var callbacks = new _map2.default();
/**
* A "click outside" of a given DOM event implementation.
*
* Based off of this StackOverflow answer:
* http://stackoverflow.com/a/14188699/376773
*
* @param {Element} el - DOM element to watch for outside clicks
* @param {Function} fn - callback function to invoke when user clicks outside of `el`
* @return {Function} a function to stop watching for "click outside" events for `el`
* @api public
*/
function clickOutside(el, fn) {
callbacks.set(el, fn);
return function unbind() {
callbacks.delete(el);
};
}
clickOutside.globalClick = globalClick;
clickOutside.install = install;
/**
* Global "click" event handler.
*
* @param {Event} e
* @api private
*/
function globalClick(e) {
callbacks.forEach(function (fn, el) {
if (!(0, _nodeContains2.default)(el, e.target)) {
// click outside
fn.call(el, e);
}
});
}
function install(doc) {
if (!doc) doc = document;
_componentEvent2.default.bind(doc, 'click', globalClick);
}
if ('undefined' !== typeof document) {
install(document);
}
module.exports = exports['default'];
//# sourceMappingURL=index.js.map