主页面和子页面都导入 signal.js
在主页面 通过 iframe 或者 open方法打开子页面
在子页面加载完成后开始通信
主页面 const signal = new Signal(); signal.atob('from a'); 监听来自子页面的信息 signal.onmessage = function(msg){}
子页面 const signal = new Signal(); signal.btoa('from b'); 监听来自主页面的信息 signal.onmessage = function(msg){}
signal.js
class Signal {
atob(message){
if(window ){
if(window._signal){
window._signal.atob = true;
window._signal.btoa = false;
window._signal.data = message;
}else{
window._signal = {
top: window,
_data: "",
atob: false,
btoa: false,
atobListener: function(){},
btoaListeners: new Map(),
}
Object.defineProperty(window._signal, 'data', {
set: function(d){
this._data = d;
if(this.atob && this.btoaListeners) {
setTimeout(()=>{
this.btoaListeners.forEach((fn, key)=>{
fn(d);
});
this.atob = false;
this.btoa = true;
},200)
}
if(this.btoa && this.atobListener) {
setTimeout(()=>{
this.atobListener(d);
this.btoa = false;
this.atob = true;
},200)
}
},
get: function(){
return this._data;
}
})
window._signal.atob = true;
window._signal.btoa = false;
window._signal.data = message;
}
}
}
btoa(message){
if(window){
let w;
if(window.opener){
w = window.opener;
}else{
w = window.parent;
}
if(w._signal){
w._signal.btoa = true;
w._signal.atob = false;
w._signal.data = message;
}
}
}
set onmessage(fn){
if(window){
let w;
if(window.opener){
w = window.opener;
}else{
w = window.parent;
}
if(w && w._signal && w._signal.top != window){
const key = window.location.pathname;
w._signal.btoaListeners.set(key, fn);
}else{
window._signal.atobListener = fn;
}
}
}
}