|
/**
* paras里面的项属性或子属性值不能为函数,如 paras:[function(){}, {action:function(){}}];
* 上面paras,数组第一项function(){}是没问题的,代码已做处理,第二项 {action:function(){}} 会有问题
*
* options = {
* objName:str, // 父窗口中,模块名称,必需
* method:str // 要调用的模块方法,必需
* paras:array // 调用方法所需参数,数组格式,必需,
* }
*/
var sendMsg = (function() {
var callBackInfos = {}; // 存储需要回调的方法
var uid = 0; // id索引,自增
function sendMsg(options) {
// 可做一些基础参数检查,检查参数是否齐全
var paras = options.paras;
var localId = options.id = uid++; // 进行编号
var callBacks = callBackInfos[localId] = {};
var callBackIndexs = options.callBackIndexs = [];
// 若是方法就需要进行替换,因为postMessage不支持传递函数对象
for ( var key in paras) {
if (typeof paras[key] == "function") {
callBacks[key] = paras[key];
paras[key] = 'function'; // 将function修改为字符串'function'
callBackIndexs.push(key); // 记录下标
}
}
window.parent.postMessage(options, "*"); // 给父窗口发消息,*任何域名domain
alert('send');
}
function receiveMessage(event) {
console.dir(event);
alert('receive');
alert('child receive'+event);
alert(JSON.stringify(event.data));
var data = event.data;
var code = data.code;
if (code >= 0) { // 大于0表示调用成功
var localId = data.id;
var result = data.result;
callBackInfos[localId][code].apply(this, result);
delete callBackInfos[localId]; // 移除相关信息
} else {
// 表示参数验正失败, 此处理自己处理
alert('invalid:'+data.result);
}
}
window.addEventListener("message", receiveMessage, false);
return sendMsg;
})();
|