yyuap-template
Version:
template project which is based on tinper
396 lines (390 loc) • 13.5 kB
JavaScript
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define([], factory);
} else if (typeof exports !== "undefined") {
factory();
} else {
var mod = {
exports: {}
};
factory();
global.jDiwork = mod.exports;
}
})(this, function () {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
return typeof obj;
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};
(function (f) {
var g;
if (typeof window !== "undefined") {
g = window;
} else if (typeof global !== "undefined") {
g = global;
} else if (typeof self !== "undefined") {
g = self;
} else {
g = this;
}
g.jDiwork = f();
})(function () {
var callbackMaps = {};
var callbackQueue = {};
var callbackPrevents = {};
var isReady = false;
var uid = 0;
var messType = 'JDIWORK';
var originList = ['http://workbench.yyuap.com', 'http://workbenchdev.yyuap.com', 'https://www.diwork.com', 'https://workbench-daily.yyuap.com', window.location.origin];
// ie9下的substring
if (navigator.userAgent.indexOf('MSIE 9.0') < 0) {
originList.push(window.location.origin.substring(0, window.location.origin.lastIndexOf(':') + 1) + '3000');
}
var getUid = function getUid() {
return ++uid;
};
var emit = function emit(event) {
try {
var type = event.type.split(':');
var name = type[0];
var id = type[1];
var data = typeof event.data === 'undefined' ? false : event.data;
var map = callbackMaps[name];
var destroy = typeof event.destroy === 'undefined' ? true : event.destroy;
} catch (e) {
console.log(e);
return;
}
if (map && map[id]) {
clearTimeout(map[id].timer);
var result = map[id].callback(data);
if (destroy) {
delete map[id];
}
return result;
}
};
var emitPreventCallBack = function emitPreventCallBack(event) {
try {
var type = event.type.split(':');
var name = type[0];
var id = type[1];
var data = typeof event.data === 'undefined' ? false : event.data;
var map = callbackPrevents[name];
var destroy = typeof event.destroy === 'undefined' ? true : event.destroy;
} catch (e) {
console.log(e);
return;
}
if (map && map[id]) {
var result = map[id].callback(data);
if (destroy) {
delete map[id];
}
return result;
}
};
var reg = function reg(name, callback, autoClear) {
autoClear = typeof autoClear === 'undefined' ? true : autoClear;
var map = callbackMaps[name];
var uid = getUid();
var callbackObj = {
callback: callback,
timer: autoClear ? setTimeout(function () {
callback(false);
delete map[uid];
}, 500) : 0
};
if (map) {
map[uid] = callbackObj;
} else {
map = {};
map[uid] = callbackObj;
callbackMaps[name] = map;
}
return name + ':' + uid;
};
var regPrevent = function regPrevent(name, callback) {
var map = callbackPrevents[name + '_prevent'];
var uid = getUid();
var callbackObj = {
callback: callback
};
if (map) {
map[uid] = callbackObj;
} else {
map = {};
map[uid] = callbackObj;
callbackPrevents[name + '_prevent'] = map;
}
return name + '_prevent:' + uid;
};
var cancel = function cancel(type) {
try {
type = event.type.split(':');
var name = type[0];
var id = type[1];
var map = callbackMaps[name];
} catch (e) {
console.log(e);
return;
}
if (map && id && map[id]) {
if (map[id].timer) {
clearTimeout(map[id].timer);
}
delete map[id];
} else if (map && !id) {
for (var key in map) {
if (map[key].timer) {
clearTimeout(map[id].timer);
}
delete map[key];
}
}
};
var trigger = function trigger(event) {
try {
var name = event.type;
var data = event.data;
var queue = callbackQueue[name];
} catch (e) {
console.log(e);
return;
}
if (queue && queue.length) {
for (var i = 0, l = queue.length; i < l; i++) {
queue[i](data);
}
}
};
var on = function on(name, callback) {
var queue = callbackQueue[name];
if (queue) {
queue.push(callback);
} else {
callbackQueue[name] = [callback];
}
};
var remove = function remove(name, callback) {
var queue = callbackQueue[name];
if (queue) {
if (callback) {
var index = queue.indexOf(callback);
if (index !== -1) {
queue.splice(index, 1);
}
} else {
delete callbackQueue[name];
}
}
};
var postToDiwork = function postToDiwork(data) {
data.messType = messType;
window.top.postMessage(JSON.stringify(data), '*');
};
var ready = function ready(callback) {
var event = {
type: reg('ready', callback)
};
if (isReady) {
emit(event);
} else {
setTimeout(function () {
emit(event);
}, 0);
}
};
var openService = function openService(serviceCode, data, type, callback) {
postToDiwork({
detail: {
serviceCode: serviceCode,
data: data,
type: type
},
callbackId: reg('openService', callback)
});
};
var closeDialog = function closeDialog() {
postToDiwork({
callbackId: 'closeDialog'
});
cancel(this.onClose);
if (this.btns) {
this.btns.forEach(function (btn) {
cancel(btn.fun);
});
}
cancel('openDialog');
};
var openDialog = function openDialog(options, callback) {
if (options.btns && options.btns.length) {
options.btns = options.btns.map(function (btn, i) {
if (btn.fun) {
var tempBtnFun = btn.fun;
btn.fun = reg('dialogBtnClick', function () {
tempBtnFun(closeDialog.bind(options));
}, false);
} else {
btn.fun = reg('dialogBtnClick', closeDialog.bind(options), false);
}
return btn;
});
}
if (options.onClose) {
var onClose = options.onClose;
options.onClose = reg('dialogOnClose', function () {
if (onClose()) {
closeDialog.call(options);
}
}, false);
} else {
options.onClose = reg('dialogOnClose', closeDialog.bind(options), false);
}
postToDiwork({
detail: {
options: options
},
callbackId: reg('openDialog', callback)
});
};
var addBrm = function addBrm(name, callback) {
postToDiwork({
detail: {
name: name,
url: window.location.href
},
callbackId: reg('addBrm', callback)
});
};
var addBrm_prevent = function addBrm_prevent(name, callback) {
postToDiwork({
detail: {
name: name,
url: window.location.href
},
callbackId: regPrevent('addBrm', callback)
});
};
var popBrm = function popBrm(index, callback) {
postToDiwork({
detail: {
index: index,
url: window.location.href
},
callbackId: reg('popBrm', callback)
});
};
var getBrm = function getBrm(callback) {
postToDiwork({
callbackId: reg('getBrm', callback)
});
};
var checkServiceOpen = function checkServiceOpen(serviceCode, callback) {
postToDiwork({
detail: {
serviceCode: serviceCode
},
callbackId: reg('checkServiceOpen', callback)
});
};
var postDataToService = function postDataToService(serviceCode, data, callback) {
postToDiwork({
detail: {
serviceCode: serviceCode,
data: data
},
callbackId: reg('postDataToService', callback)
});
};
var getContext = function getContext(callback) {
postToDiwork({
callbackId: reg('getContext', callback)
});
};
var getHost = function getHost(detail, callback) {
postToDiwork({
detail: detail,
callbackId: reg('getHost', callback)
});
};
var onData = function onData(callback) {
on('data', callback);
};
var customMessage = function customMessage(type) {
postToDiwork({
callbackId: type
});
};
var openMessage = function openMessage(data, callback) {
postToDiwork({
detail: data,
callbackId: reg('openMessage', callback || function () {})
});
};
var showDialog = function showDialog(data, callback) {
postToDiwork({
detail: data,
callbackId: reg('showDialog', callback || function () {})
});
};
var closeDialogNew = function closeDialogNew(data, callback) {
postToDiwork({
detail: data,
callbackId: reg('closeDialogNew', callback || function () {})
});
};
window.addEventListener('DOMContentLoaded', function () {
isReady = true;
}, false);
window.addEventListener('message', function (event) {
var data = event.data;
if (!data) {
return;
}
try {
if (typeof data === 'string') {
data = JSON.parse(data);
}
} catch (e) {
console.log(e);
return;
}
if (data && (typeof data === "undefined" ? "undefined" : _typeof(data)) === 'object' && data.type) {
if (data.type.indexOf(':') < 0) {
trigger(data);
} else {
if (data.type.indexOf('_prevent') > 0) {
emitPreventCallBack(data);
} else {
emit(data);
}
}
}
}, false);
window.addEventListener('click', function () {
postToDiwork({
callbackId: 'rootClick'
});
}, false);
return {
ready: ready,
openService: openService,
checkServiceOpen: checkServiceOpen,
addBrm: addBrm,
addBrm_prevent: addBrm_prevent,
popBrm: popBrm,
getBrm: getBrm,
openDialog: openDialog,
onData: onData,
getContext: getContext,
getHost: getHost,
postDataToService: postDataToService,
customMessage: customMessage,
openMessage: openMessage,
showDialog: showDialog,
closeDialogNew: closeDialogNew
};
});
});