adajs
Version:
Integrated Web Framework
99 lines (96 loc) • 3.03 kB
JavaScript
const EVENTTYPES = {
HTMLEvents: "load,unload,abort,error,select,change,submit,reset,focus,blur,resize,scroll",
MouseEvent: "click,mousedown,mouseup,mouseover,mousemove,mouseout",
UIEvent: "DOMFocusIn,DOMFocusOut,DOMActivate",
MutationEvent: "DOMSubtreeModified,DOMNodeInserted,DOMNodeRemoved,DOMNodeRemovedFromDocument,DOMNodeInsertedIntoDocument,DOMAttrModified,DOMCharacterDataModified"
};
const UNBUBBLINGEVENT = ["load", "unload", "focus", "blur", "pointerenter", "pointerleave", "beforeunload", "stop", "start", "finish", "bounce", "beforeprint", "afterprint", "propertychange", "filterchange", "readystatechange", "losecapture", "dragenter", "dragexit", "draggesture", "dragover", "CheckboxStateChange", "RadioStateChange", "close", "command", "contextmenu", "overflow", "overflowchanged", "popuphidden", "popuphiding", "popupshowing", "popupshown", "broadcast", "commandupdate"];
function eventHandler(e) {
let events = e.currentTarget.events[e.type];
for (let i in events) {
events[i].call(e.currentTarget, e);
}
}
let helper = {
isEvent(type) {
let result = {
type: type,
interfaceName: null
};
for (let i in EVENTTYPES) {
if (EVENTTYPES[i].indexOf(type) !== -1) {
result.interfaceName = i;
break;
}
}
return result;
},
trigger(dom, type, data) {
let a = this.isEvent(type);
if (a.interfaceName) {
let eventx = document.createEvent(a.interfaceName);
switch (a.interfaceName) {
case "MouseEvent":
eventx.initMouseEvent(type, true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
break;
case "HTMLEvents":
eventx.initEvent(type, true, false, window);
break;
case "UIEvents":
eventx.initUIEvents(type, true, false, window, null);
break;
case "MutationEvent ":
eventx.initMutationEvent(type, true, false, window, null, null, null, null);
break;
}
dom.dispatchEvent(eventx);
} else {
let evt = document.createEvent("CustomEvent");
evt.initCustomEvent(type, true, true, data);
dom.dispatchEvent(evt);
}
return dom;
},
canBubbleUp(type) {
return UNBUBBLINGEVENT.indexOf(type) === -1;
},
bind(dom, type, fn, capt = false) {
if (!dom.events) {
dom.events = {};
}
if (dom.events[type]) {
dom.events[type].push(fn);
} else {
dom.events[type] = [];
dom.events[type].push(fn);
}
dom.addEventListener(type, eventHandler, capt);
return dom;
},
unbind(dom, type, fn) {
if (dom.events) {
if (type && type !== "") {
let events = dom.events[type];
if (events) {
dom.removeEventListener(type, eventHandler, false);
if (fn) {
let index = events.indexOf(fn);
if (index !== -1) {
events.splice(events.indexOf(fn), 1);
}
} else {
events.length = 0;
}
}
} else {
let c = dom.events;
Reflect.ownKeys(dom.events).forEach(type => {
dom.removeEventListener(type, eventHandler, false);
dom.events[type].length = 0;
});
}
}
return dom;
}
};
module.exports = helper;