背景
项目中用iframe嵌套了另外一个系统的页面,现在不想要那个页面的标题,需要去掉。
基本知识点
父给子传消息
iframe父给子传消息(引用iframe的页面给iframe里面的内容页面发消息):this.$refs[‘multiIframe’].contentWindow.postMessage(data, ‘*’)
子给父传消息
iframe子给父传消息(iframe内容页面给iframe的引用页面发消息) window.parent.postMessage(data,’’) 或者Window.postMessage(data,’’) 这里到底用window.parent 还是不加parent都是可以的,但是如果用了不加parent的,注意,父在接收的时候,不能直接window.addeventListener了,而需要用this.$refs[‘multiIframe’].contentWindow 注意PostMessage有一点最重要就是postMessage出去的window和addEventListener的window要是同一个window。
之前犯错更正
postMessage中的参数window.addEventListener(‘message’,fun),第一项一定是’message’. 需要注意的是判断是哪个postMessage出来的消息,之前我一直有的一个误区是通过window.addEventListener来判断出来的,导致写过低级错误的代码,把window.addEventListener(‘message’,fun)中的’message’参数写成了我post出来的参数,比如window.addEventListener(‘aaa’,fun),这错到姥姥家了。实际上,是通过fun(evernt)中的event中的data拿到的参数,来进行的判断,只要页面存在后,通过全局发出来的message,都会进fun,是需要在fun里面通过event.data进行判断处理。
Vue脚手架结合使用需要注意的点
这次有一个需求是当前的一个vue页面需要嵌套另外系统的页面,是通过iframe来实现的。单纯的嵌套是没有问题的,问题在于,如果需要对嵌套的页面的一些样式进行修改,比如隐藏页面的头部,那就会有问题存在。问题在于我们虽然是在iframe的onload中进行获取的,但是会存在当前页面加载好了,但是iframe中的页面没加载好的情况。那就会出现获取dom失败的错误,所以我们应该要确保iframe中的dom存在了再进行操作,而iframe中的dom生成完毕需要通过iframe中的mounted阶段才能判断,所以需要iframe嵌套的子元素来通知父元素页面dom存在。
所以要进行如下的操作:
嵌套iframe的父页面在computed中添加接收子页面消息的时间addEvnetListener;子页面在mounted后发送dom生成完毕的消息,通过postMessage的形式来发送。接收到子页面的消息之后,父页面再给子页面发送需要执行的页面修改的指令(通过postMessage发)。 子页面再在mounted中添加接收信息的函数addEventListener,来进行相应的dom操作。
问: 为什么要这么复杂,直接由父页面的mounted发送给子页面不就行了吗?
这会存在问题,就是父mounted中发送消息的时候,子页面中的addEventListener还没有执行(可能子页面都没有生成),导致发出去了接收不到。(需要注意,接收消息addEventListener需要在发消息postMessage之前执行)。