实现一个客户端发送 “1+2“ 跨域的另一个页面中,回调返回”3“的场景。
客户端:请在 http://127.0.0.1/pk/index.html 打开
<html>
<meta charset="utf-8" />
<head>
<title>
测试页面, http://127.0.0.1/pk/index.html
</title>
</head>
<body>
<iframe id="database" src="http://localhost/pk/database.html">
</iframe>
<script type="text/javascript">
function SyncMessageClient(win,domain){
var funName = 0;
var scope = {};
function getNextCallbackName(callback){
var retfunc = "cb_" + (funName++);
scope[retfunc] = function(){
callback.apply(win,arguments);
}
return retfunc;
}
window.addEventListener("message",function(ev){
var rdata = JSON.parse(ev.data);
var fn = scope[rdata.fn];
fn(rdata.args);
delete scope(rdata.fn);
})
this.sendMessage = function(targetWindow,data,callback,targetDomain){
var callData = {data:data,fn:getNextCallbackName(callback)};
targetWindow.postMessage(JSON.stringify(callData),targetDomain);
}
};
function SyncMessageServer(win,domain,onSendMessage){
window.addEventListener("message",function(ev){
var json = JSON.parse(ev.data);
var fn = json.fn;
console.dir(json);
ev.data = JSON.stringify(json);
var result = onSendMessage(ev);
ev.source.postMessage(
JSON.stringify({fn:fn,args:[result]}),"*");
});
}
var objSyncMsg = new SyncMessageClient(window,"*");
function send(data,callback,domain){
var databaseWindow = document.getElementById("database").contentWindow;
objSyncMsg.sendMessage(databaseWindow,"1+2",function(ok){
alert(ok);
},"*");
}
</script>
<input type="button" value="click me" onclick="send()"></input>
</body>
</html>
服务的实现:
<html>
<meta charset="utf-8" />
<head>
<title>
存储页面
</title>
</head>
<body>
<script type="text/javascript">
function SyncMessageServer(win,domain,onSendMessage){
window.addEventListener("message",function(ev){
var json = JSON.parse(ev.data);
var fn = json.fn;
ev.data = JSON.stringify(json);
var result = onSendMessage(ev);
ev.source.postMessage(
JSON.stringify({fn:fn,args:[result]}),"*");
});
}
var sendMessageServer = new SyncMessageServer(window,"*", function (ev) {
var json = JSON.parse(ev.data);
var fn = json.fn;
var result = eval(json.data)
return result;
})
</script>
</body>
</html>