yyzone
Version:
yyzone vue components and utils
406 lines (400 loc) • 11.9 kB
JavaScript
(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 () {
return ++uid;
};
var emit = function (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 (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 (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 (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 (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 (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 (name, callback) {
var queue = callbackQueue[name];
if (queue) {
queue.push(callback);
} else {
callbackQueue[name] = [callback];
}
};
var remove = function (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 (data) {
data.messType = messType;
window.top.postMessage(JSON.stringify(data), '*');
};
var ready = function (callback) {
var event = {
type: reg('ready', callback)
}
if (isReady) {
emit(event);
} else {
setTimeout(function () {
emit(event);
}, 0);
}
};
var openService = function (serviceCode, data, type, callback) {
postToDiwork({
detail: {
serviceCode: serviceCode,
data: data,
type: type
},
callbackId: reg('openService', callback)
});
};
var closeDialog = function () {
postToDiwork({
callbackId: 'closeDialog'
});
cancel(this.onClose);
if (this.btns) {
this.btns.forEach(function (btn) {
cancel(btn.fun);
});
}
cancel('openDialog');
}
var openDialog = function (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 (name, callback) {
postToDiwork({
detail: {
name: name,
url: window.location.href
},
callbackId: reg('addBrm', callback)
});
};
var addBrm_prevent = function (name, callback) {
postToDiwork({
detail: {
name: name,
url: window.location.href
},
callbackId: regPrevent('addBrm', callback)
});
};
var popBrm = function (index, callback) {
postToDiwork({
detail: {
index: index,
url: window.location.href
},
callbackId: reg('popBrm', callback)
});
};
var modifyBrm = function (name, callback) {
postToDiwork({
detail: {
name: name
},
callbackId: reg('modifyBrm', callback)
});
};
var getBrm = function (callback) {
postToDiwork({
callbackId: reg('getBrm', callback)
});
};
var checkServiceOpen = function (serviceCode, callback) {
postToDiwork({
detail: {
serviceCode: serviceCode
},
callbackId: reg('checkServiceOpen', callback)
});
};
var postDataToService = function (serviceCode, data, callback) {
postToDiwork({
detail: {
serviceCode: serviceCode,
data: data,
},
callbackId: reg('postDataToService', callback)
});
};
var getContext = function (callback) {
postToDiwork({
callbackId: reg('getContext', callback)
});
};
var onData = function (callback) {
on('data', callback);
};
var customMessage = function (type) {
postToDiwork({
callbackId: type,
});
};
var openMessage = function (data, callback) {
postToDiwork({
detail: data,
callbackId: reg('openMessage', callback || function () {})
});
};
var showDialog = function (data, callback) {
postToDiwork({
detail: data,
callbackId: reg('showDialog', callback || function () {})
});
};
var closeDialogNew = function (data, callback) {
postToDiwork({
detail: data,
callbackId: reg('closeDialogNew', callback || function () {})
});
};
var openFrame = function (data, callback) {
postToDiwork({
detail: data,
callbackId: reg('openFrame', callback || function () {})
});
};
var closeFrame = function (data, callback) {
postToDiwork({
detail: data,
callbackId: reg('closeFrame', callback || function () {})
});
};
var getPageParam = function (callback) {
postToDiwork({
callbackId: reg('getPageParam', callback)
});
};
window.addEventListener('DOMContentLoaded', function () {
isReady = true;
}, false);
window.addEventListener('message', function (event) {
var data = event.data;
var origin = event.origin || event.originalEvent.origin;
// console.log('ooooorrrrriiiiiiggggnnnn', origin);
if (originList.indexOf(origin) < 0 || !data) {
return;
}
try {
if (typeof data === 'string') {
data = JSON.parse(data);
}
} catch (e) {
console.log(e);
return;
}
if (data && 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,
postDataToService: postDataToService,
customMessage: customMessage,
openMessage: openMessage,
showDialog: showDialog,
closeDialogNew: closeDialogNew,
openFrame: openFrame,
closeFrame: closeFrame,
getPageParam: getPageParam,
modifyBrm: modifyBrm
};
});