elements
Version:
prime dom library
79 lines (54 loc) • 2.36 kB
JavaScript
/*
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 = $