VUE - iframe消息通信postMessage
VUE - iframe消息通信postMessage
1. 准备两个 vue 项目
1) 项目1,地址:http://cdeserver.railplus.com:8000/
2) 项目2,地址:http://localhost:8081/
2. 在项目2中 iframe 引入
1) web_config.js ,在 public 中 准备配置文件
window.config = {
iframeUrl: 'http://cdeserver.railplus.com:8000/'
}
2) index.html , 在 public 中 <head> 引入 web_config.js
<script type="text/javascript" src="./web_config.js"></script>
在 <body> 中写入 iframe
<div class="iframe">
<iframe id="iframeCDE" class="iframe" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no"
allowtransparency="yes"></iframe>
</div>
在js中设置 iframe 的地址,注意:先设置地址,再注册接收信息方法
<script>
window.onload = function () {
document.getElementById('iframeCDE').setAttribute('src', window.config.iframeUrl);
Register_tid();
}
</script>
3) tidings_client.js ,在 public 中 准备通信中间件文件
//调用记录,返回数据 callNo:{}
let CallRecord = {};
//注册
let Register_tid = () => {
// 监听子级给父级发送过来的消息
window.addEventListener(
"message",
function (event) {
let origin = event.origin;
let callNo = event.data.callNo;
if (origin == window.config.iframeUrl && CallRecord[callNo])
CallRecord[callNo]();
},
false
);
}
let CallMethodName = {
SetLocate: 'SetLocate',
SetHighlight: 'SetHighlight'
}
// 通信调用
let TidCall = {
//设置定位
SetLocate: (primityFlag, callBackFunction) => {
postMessage(CallMethodName.SetLocate, {
primityFlag: primityFlag
}, callBackFunction);
},
//设置高亮
SetHighlight: (primityFlag) => {
let callNo = getCallNo();
postMessage(CallMethodName.SetHighlight, {
callNo: callNo,
primityFlag: primityFlag
});
}
}
//获取CallNo
getCallNo = () => {
return `NO${Math.round(Math.random() * 10000000000)}`;
}
//消息发送
postMessage = (methodName, data, callBackFunction) => {
let callNo = getCallNo(); //调用唯一主键
data.callNo = callNo;
var iframe = document.getElementById("iframeCDE");
var iframeWindow = iframe.contentWindow;
var targetOrigin = window.config.iframeUrl; // 'http://cdeserver.railplus.com:8000'; "*";
iframeWindow.postMessage({
methodName: methodName,
data: data
}, targetOrigin);
if (callBackFunction) CallRecord[callNo] = callBackFunction;
}
在 public 中 <head> 引入 web_config.js
<script type="text/javascript" src="./tidings_client.js"></script>
3. 在项目1 中 配置
1) 创建 tidings_server.js ,配置 通信中间件 src / views / tidings_server.js
import CesiumUtil from './views/main2/utils/cesiumUtil';
//注册
let Register_tid = () => {
window.addEventListener(
'message',
function (event) {
Analysis(event);
},
false
);
}
let CallBackTid = (data) => {
console.log('CallBackTid');
window.top.postMessage(data, '*');
}
//解析
let Analysis = (event) => {
let methodName = event.data.methodName;
let data = event.data.data;
eval(`${methodName}(${JSON.stringify(data)})`);
}
//设置定位
let SetLocate = (data) => {
let callNo = data.callNo;
CesiumUtil.LocateModel(data.primityFlag);
//回调
CallBackTid({
callNo: callNo,
message: '回调结果。'
});
}
export {
Register_tid
}
2) 在 App.vue 中引入 tidings_server
import { Register_tid } from './tidings_server';
在 mounted 中注册
Register_tid();
4. 测试
在 项目1 中 调用 通信组件
在 项目1 中 某 vue页 创建一个按钮,事件如下,其中 fun_txt 为回调函数
fun_txt() {
this.msg = "99999";
},
fun_message() {
TidCall.SetLocate(1222, this.fun_txt);
},
完成!
引用:https://blog.csdn.net/qq_42052896/article/details/112496460

浙公网安备 33010602011771号