vue-global-events
Version:
Component to register global events
93 lines (78 loc) • 2.18 kB
JavaScript
/**
* vue-global-events v1.1.1
* (c) 2019 Damian Dulisz <damian.dulisz@gmail.com>
* @license MIT
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.VueGlobalEvents = factory());
}(this, (function () { 'use strict';
var _isIE;
function isIE () {
return _isIE == null
? (_isIE = /msie|trident/.test(window.navigator.userAgent.toLowerCase()))
: _isIE
}
var modifiersRE = /^[~!&]*/;
var nonEventNameCharsRE = /\W+/;
var names = {
'!': 'capture',
'~': 'once',
'&': 'passive'
};
function extractEventOptions (eventDescriptor) {
var ref = eventDescriptor.match(modifiersRE);
var modifiers = ref[0];
// IE only supports capture option and it has to be a boolean
// https://github.com/shentao/vue-global-events/issues/14
if (isIE()) {
return modifiers.indexOf('!') > -1
}
return modifiers.split('').reduce(function (options, modifier) {
options[names[modifier]] = true;
return options
}, {})
}
var index = {
name: 'GlobalEvents',
props: {
target: {
type: String,
default: 'document'
},
filter: {
type: Function,
default: function (e) { return true; }
}
},
render: function (h) { return h(); },
mounted: function mounted () {
var this$1 = this;
this._listeners = Object.create(null);
Object.keys(this.$listeners).forEach(function (event) {
var listener = this$1.$listeners[event];
var handler = function (e) {
this$1.filter(e, listener, event) && listener(e);
};
window[this$1.target].addEventListener(
event.replace(nonEventNameCharsRE, ''),
handler,
extractEventOptions(event)
);
this$1._listeners[event] = handler;
});
},
beforeDestroy: function beforeDestroy () {
var this$1 = this;
for (var event in this$1._listeners) {
window[this$1.target].removeEventListener(
event.replace(nonEventNameCharsRE, ''),
this$1._listeners[event],
extractEventOptions(event)
);
}
}
};
return index;
})));