- // EventListener | MIT/GPL2 | github.com/jonathantneal/EventListener
- this.Element && Element.prototype.attachEvent && !Element.prototype.addEventListener && (function () {
- function addToPrototype(name, method) {
- Window.prototype[name] = HTMLDocument.prototype[name] = Element.prototype[name] = method;
- }
- // add
- addToPrototype("addEventListener", function (type, listener) {
- var
- target = this,
- listeners = target.addEventListener.listeners = target.addEventListener.listeners || {},
- typeListeners = listeners[type] = listeners[type] || [];
- // if no events exist, attach the listener
- if (!typeListeners.length) {
- target.attachEvent("on" + type, typeListeners.event = function (event) {
- var documentElement = target.document && target.document.documentElement || target.documentElement || { scrollLeft: 0, scrollTop: 0 };
- // polyfill w3c properties and methods
- event.currentTarget = target;
- event.pageX = event.clientX + documentElement.scrollLeft;
- event.pageY = event.clientY + documentElement.scrollTop;
- event.preventDefault = function () { event.returnValue = false };
- event.relatedTarget = event.fromElement || null;
- event.stopImmediatePropagation = function () { immediatePropagation = false; event.cancelBubble = true };
- event.stopPropagation = function () { event.cancelBubble = true };
- event.target = event.srcElement || target;
- event.timeStamp = +new Date;
- // create an cached list of the master events list (to protect this loop from breaking when an event is removed)
- for (var i = 0, typeListenersCache = [].concat(typeListeners), typeListenerCache, immediatePropagation = true; immediatePropagation && (typeListenerCache = typeListenersCache[i]); ++i) {
- // check to see if the cached event still exists in the master events list
- for (var ii = 0, typeListener; typeListener = typeListeners[ii]; ++ii) {
- if (typeListener == typeListenerCache) {
- typeListener.call(target, event);
- break;
- }
- }
- }
- });
- }
- // add the event to the master event list
- typeListeners.push(listener);
- });
- // remove
- addToPrototype("removeEventListener", function (type, listener) {
- var
- target = this,
- listeners = target.addEventListener.listeners = target.addEventListener.listeners || {},
- typeListeners = listeners[type] = listeners[type] || [];
- // remove the newest matching event from the master event list
- for (var i = typeListeners.length - 1, typeListener; typeListener = typeListeners[i]; --i) {
- if (typeListener == listener) {
- typeListeners.splice(i, 1);
- break;
- }
- }
- // if no events exist, detach the listener
- if (!typeListeners.length && typeListeners.event) {
- target.detachEvent("on" + type, typeListeners.event);
- }
- });
- // dispatch
- addToPrototype("dispatchEvent", function (eventObject) {
- var
- target = this,
- type = eventObject.type,
- listeners = target.addEventListener.listeners = target.addEventListener.listeners || {},
- typeListeners = listeners[type] = listeners[type] || [];
- try {
- return target.fireEvent("on" + type, eventObject);
- } catch (error) {
- if (typeListeners.event) {
- typeListeners.event(eventObject);
- }
- return;
- }
- });
- // CustomEvent
- Object.defineProperty(Window.prototype, "CustomEvent", {
- get: function () {
- var self = this;
- return function CustomEvent(type, eventInitDict) {
- var event = self.document.createEventObject(), key;
- event.type = type;
- for (key in eventInitDict) {
- if (key == 'cancelable'){
- event.returnValue = !eventInitDict.cancelable;
- } else if (key == 'bubbles'){
- event.cancelBubble = !eventInitDict.bubbles;
- } else if (key == 'detail'){
- event.detail = eventInitDict.detail;
- }
- }
- return event;
- };
- }
- });
- // ready
- function ready(event) {
- if (ready.interval && document.body) {
- ready.interval = clearInterval(ready.interval);
- document.dispatchEvent(new CustomEvent("DOMContentLoaded"));
- }
- }
- ready.interval = setInterval(ready, 1);
- window.addEventListener("load", ready);
- })();
|