iframe和父页面消息通信

一、需求iframe和父页面消息通信(Vue + Element UI项目

二、实现

基类plugin.postMessage.js

TypeScript 复制代码
;
let SAFEORIGIN = process.env.VUE_APP_SAFE_ACCESS_ORIGIN;
let origin = "*";
let THAT;
let mark = [];
function __(args,origin){
    if( window.top !== window.self ){
        window.parent.postMessage( args , origin || "*");
    }
};
function message(){
    if( window ){
        if( window.top === window.self ){
            return THAT.prototype.$message.apply(THAT, arguments );
        }else{
            __( { __: 'post', __type: "message", args : [].slice.apply(arguments) } );
            return Promise.resolve();
        };
    }

};
message.error = function(){
    if( window ){
        if( window.top === window.self ){
            return THAT.prototype.$message.error.apply(THAT, arguments );
        }else{
            __( { __: 'post', __type: "error", args : [].slice.apply(arguments) } );
            return Promise.resolve();
        };
    }
};
function confirm(){
    if( window ){
        if( window.top === window.self ){
            return THAT.prototype.$confirm.apply(THAT, arguments );
        }else{
            let __time = btoa( ( new Date).valueOf() );
			if( mark.indexOf( __time ) < 0 ){
				mark= [__time ];
			}else{
				do{
					__time += "1";
				}while(mark.indexOf( __time ) >= 0 );
				mark.push( __time )
			}
			
			
            return new Promise( (resolve,reject) => {
                let _ =  e => {
                    if( e.data && e.data["__"] ==="response" && e.data["__time"] === __time ){
                        if( e.data['__response'] === "resolve" ){
                            resolve( !0 )
                        }else{
                            reject( !1 );
                        }
                        window.removeEventListener( 'message' , _ );
                    }
                }
                window.addEventListener( 'message' , _ );
                __( { __time, __: "request", __type: "confirm" , args : [].slice.apply(arguments)  } );
            });

        }
    }else{
        return Promise.reject( new Error );
    }
};
function testPostMessageSafe(){
    let __time = btoa( ( new Date).valueOf() );
	if( mark.indexOf( __time ) < 0 ){
		mark= [__time ];
	}else{
		do{
			__time += "1";
		}while(mark.indexOf( __time ) >= 0 );
		mark.push( __time )
	}
    return new Promise( ( resolve, reject ) => {
        let _ = e => {
            if( e && e.data && e.data[ "__time" ] === __time && e.data[ "__" ] === "response" && e.data[ "__response"] ==="test"){
                origin = e.origin;
                if( SAFEORIGIN && SAFEORIGIN.split(',').indexOf( origin ) > -1 ){
                    resolve( origin );
                }else{
                    reject( -1 )
                }
                window.removeEventListener( "message" , _ );
            }
        }
        window.addEventListener( "message" , _ );
        __( { __: "request" , args , __time } );
    })
};
function postDirect( directName, args, safe ){
    if( safe ){
        testPostMessageSafe().then(() => {
            __({ __ : "direct", __direct: directName ,args, origin });
        }).catch( ()=>{})
    }else{
        __( { __: "direct", __direct: directName , args } );
    }
};
function sendMessage( args , safe ){
    if( safe ){
        testPostMessageSafe().then(() => {
            __( { __: "post", args, origin } );
        }).catch( ()=>{})
    }else{
        __({ __: "post", args });
    }
};
function requestMessage( args,safe ){
    if( window && window.top !== window.self ){
        function req(){
            let __time = btoa( ( new Date).valueOf() );
			if( mark.indexOf( __time ) < 0 ){
				mark= [__time ];
			}else{
				do{
					__time += "1";
				}while(mark.indexOf( __time ) >= 0 );
				mark.push( __time )
			}
            return new Promise( ( resolve, reject ) => {
                let _ = e => {
                    if( e && e.data && e.data[ "__time" ] === __time && e.data[ "__" ] === "response" ){
						if( e.data[ "__response"]  === "reject" ){
                            reject( e.data[ "args" ] )
                        }else{
                            resolve( e.data[ "args"] )
                        }
                        window.removeEventListener( "message" , _ );
                    }
                }
                window.addEventListener( "message" , _ );
                __( { __: "request" , args , __time } );
            })
        };
        if( safe ){
            return testPostMessageSafe().then(() => {
                return req();
            })
        }else{
            return req();
        }
    }else{
		return Promise.resolve();
	}
};
export default function( v ){
    THAT = v;
    if( v ){
        v.prototype.$$confirm = confirm;		//向外抛出 element UI confirm 弹层 , 接收返回处理
        v.prototype.$$message = message;		// 向外抛出 element UI Message 
        v.prototype.$$postDirect = postDirect;	//向外抛出带有事件名字的消息
        v.prototype.$$sendMessage = sendMessage;	//PostMessage
        v.prototype.$$requestMessage = requestMessage;	//向外请求带有参数消息,可接收返回值处理
        v.prototype.$$__ = __;
    }
}

iframe里发送消息给父页面

TypeScript 复制代码
if( window.self !== window.top && !this.framelimit ){
                    this.$nextTick( ()=>{
                        this.$$postDirect("resize",document.body.scrollHeight)
                    })
                }

父页面接收消息

window.addEventListener("message", this.__receiveMessage);

相关推荐
计算机魔术师1 分钟前
Anthropic 自己承认:模型越来越难管住了
前端
程序员良辰4 分钟前
服务器 JDK 环境变量配置:一键安装和手动配置有什么区别?
开发语言·python
两只羊ovo10 分钟前
Agent 干活的底层地基:path 路径 + fs 文件系统,一次讲透
前端
xiaominlaopodaren10 分钟前
three.js地图视口瓦片(二):如何形成完整视口多边形
javascript·gis·three.js
一用书生10 分钟前
我给 ChatGPT、DeepSeek、Kimi 都加了一个「保存为笔记」按钮
前端·ai编程·vibecoding
奈斯先生Vector11 分钟前
本地图片识别怎么接入多模态 AI?用 Python API 理解 GPT-4o Vision 的真实工作流
开发语言·人工智能·windows·python·网络协议·http·aigc
咖啡无伴侣13 分钟前
1. 从零搭建企业级 Monorepo 工程化模板:初始化、应用创建与共享 TypeScript 配置
前端·前端框架
moonsims14 分钟前
再议AiBrainBox-V的前左右三目布局-满足多目SLAM算法;对比单下视VIO(低空、地面纹理丰富、飞行速度适中无人机 )&多目VIO
前端·人工智能·量子计算
AI编程实验室14 分钟前
Agent Handoff 自动跟踪 Skill:安装、事件映射与证据分级
前端·ai编程
OPEN-F15 分钟前
C++17新特性精讲:结构化绑定、if constexpr与实用类型
开发语言·c++