UNPKG

elements

Version:
79 lines (54 loc) 2.36 kB
/* events */"use strict" var Emitter = require("prime/emitter") var $ = require("./base") var html = document.documentElement var addEventListener = html.addEventListener ? function(node, event, handle, useCapture){ node.addEventListener(event, handle, useCapture || false) return handle } : function(node, event, handle){ node.attachEvent('on' + event, handle) return handle } var removeEventListener = html.removeEventListener ? function(node, event, handle, useCapture){ node.removeEventListener(event, handle, useCapture || false) } : function(node, event, handle){ node.detachEvent("on" + event, handle) } $.implement({ on: function(event, handle, useCapture){ return this.forEach(function(node){ var self = $(node) var internalEvent = event + (useCapture ? ":capture" : "") Emitter.prototype.on.call(self, internalEvent, handle) var domListeners = self._domListeners || (self._domListeners = {}) if (!domListeners[internalEvent]) domListeners[internalEvent] = addEventListener(node, event, function(e){ Emitter.prototype.emit.call(self, internalEvent, e || window.event, Emitter.EMIT_SYNC) }, useCapture) }) }, off: function(event, handle, useCapture){ return this.forEach(function(node){ var self = $(node) var internalEvent = event + (useCapture ? ":capture" : "") var domListeners = self._domListeners, domEvent, listeners = self._listeners, events if (domListeners && (domEvent = domListeners[internalEvent]) && listeners && (events = listeners[internalEvent])){ Emitter.prototype.off.call(self, internalEvent, handle) if (!self._listeners || !self._listeners[event]){ removeEventListener(node, event, domEvent) delete domListeners[event] for (var l in domListeners) return delete self._domListeners } } }) }, emit: function(){ var args = arguments return this.forEach(function(node){ Emitter.prototype.emit.apply($(node), args) }) } }) module.exports = $