/* listen.js * * Author: nanto_vi (TOYAMA Nao) * Lisence: Public Domain * Usage: * (function (e) {doSomething();}).listen(element, eventType); */ (function () { var targetIdSeed = 0; var listenerIdSeed = 0; var typeResolver = {}; this._lsn_listeners = {}; if (document.addEventListener) { var getListenerWrapper = function (listener) { var listenerId = listener._lsn_listenerId; if (listenerId) return _lsn_listeners[listenerId].wrapper; listenerId = listener._lsn_listenerId = ++listenerIdSeed; _lsn_listeners[listenerId] = { listener: listener, wrapper: function (e) { _lsn_listeners[listenerId].listener.call(this, e); } }; listener = null; return _lsn_listeners[listenerId].wrapper; }; } else if (document.attachEvent) { var getListenerWrapper = function (listener, target) { if (!target) return listener; var targetId = target._lsn_targetId; var listenerId = listener._lsn_listenerId; if (targetId && listenerId) return _lsn_listeners[targetId][listenerId].wrapper; if (!targetId) { targetId = target._lsn_targetId = ++targetIdSeed; _lsn_listeners[targetId] = {target: target}; } if (!listenerId) { listenerId = listener._lsn_listenerId = ++listenerIdSeed; } _lsn_listeners[targetId][listenerId] = { listener: listener, wrapper: function (e) { fixEvent(e, _lsn_listeners[targetId].target); _lsn_listeners[targetId][listenerId].listener .call(e.currentTarget, e); } }; listener = target = null; return _lsn_listeners[targetId][listenerId].wrapper; }; var htmlIsRoot = ("compatMode" in document && document.compatMode == "CSS1Compat"); var fixEvent = function (e, currentTarget) { var type = e.type; e.target = e.srcElement; e.currentTarget = currentTarget; e.relatedTarget = (type == "mouseover") ? e.fromElement : (type == "mouseout") ? e.toElement : null; e.detail = (type == "click") ? 1 : (type == "dblclick") ? 2 : (type == "mousewheel") ? -e.wheelDelta : 0; e.which = (type.indexOf("key") != -1) ? e.keyCode : e.button; var root = htmlIsRoot ? document.documentElement : document.body; e.pageX = e.clientX + root.scrollLeft - root.clientLeft; e.pageY = e.clientY + root.scrollTop - root.clientTop; e.stopPropagation = stopPropagation; e.preventDefault = preventDefault; }; var stopPropagation = function () { this.cancelBubble = true; }; var preventDefault = function () { this.returnValue = false; }; typeResolver.DOMMouseScroll = "mousewheel"; } Function.prototype.listen = function (target, type) { if (type in typeResolver) type = typeResolver[type]; if (target.addEventListener) target.addEventListener(type, getListenerWrapper(this), false); else if (target.attachEvent) target.attachEvent("on" + type, getListenerWrapper(this, target)); return this; }; Function.prototype.unlisten = function (target, type) { if (type in typeResolver) type = typeResolver[type]; if (target.removeEventListener) target.removeEventListener(type, getListenerWrapper(this), false); else if (target.detachEvent) target.detachEvent("on" + type, getListenerWrapper(this, target)); return this; }; })();