分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

html5 postMessage 实现类似 sendMessage 的同步效果,支持跨域

发布时间:2023-09-06 01:48责任编辑:林大明关键词:跨域

实现一个客户端发送 “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>

  

html5 postMessage 实现类似 sendMessage 的同步效果,支持跨域

原文地址:https://www.cnblogs.com/evlon/p/8734019.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved