入坑
起源是使用vue的ssr框架nuxt.js中遇到的需求,在要求seo的情况下,使用了此框架,但是需求是需要加载第三方或者自己写的html文件。但是需要使用共同的导航条和页脚。由于不能使用组件化,所以想到了iframe嵌入的解决方案。
本地页面
因为nuxt.js架构中可以直接访问static文件中的静态文件,所以我就把静态文件放入到了这个文件夹,然后也实现了嵌入的功能,主要的处理就是嵌入页面自适应网页的高度,简单处理代码如下:
html
<iframe
id="external-frame"
class="content"
:src="`XXXX/htmls/${title}.html`"
scrolling="no"
frameborder="0"
></iframe>
js
mounted() {
document.domain = 'XXXX.com'
setInterval(this.setHight(document.getElementById('external-frame')), 100)
},
computed: {},
methods: {
setHight(iframe) {
if (iframe) {
var iframeWin =
iframe.contentWindow || iframe.contentDocument.parentWindow
if (iframeWin.document.body) {
iframe.height =
iframeWin.document.documentElement.scrollHeight ||
iframeWin.document.body.scrollHeight
}
console.log(
'iframe',
iframe.contentWindow || iframe.contentDocument.parentWindow,
iframeWin.document.documentElement.scrollHeight ||
iframeWin.document.body.scrollHeight
)
}
}
}
定义一个iframe,然后获取到加载完成的dom的高度,然后在更改页面高度来完成自适应。这样的处理没有什么问题。
出现跨域问题
在使用本项目文件夹中的代码的时候,没有出现任何问题,但是当把静态文件换成oss存储的html文件路径之后,就出现了,文件加载成功,但是页面的高度不能够设置成自适应。打开控制台,发现了报错,提示信息为跨域问题。此处的跨域是由于二级域名不一样,所以也比较好解决,然后找了解决方式,记录一下:
- 设置domain
主要适用于主域相同,子域不同。在两个页面中设置document.domain=主域名
- postmessage
window.postMessage方法可以安全地实现跨源通信,写明目标窗口的协议、主机地址或端口就可以发信息给它。
// b页面
parent.postMessage(
value,
"http://a.demo.com"
);
// a页面
window.addEventListener("message", function( event ) {
if (event.origin !== 'http://b.demo.com') return;
toggleFullScreen()
});
总结
通过以上的方法,我们就可以和iframe自由通信,这是我觉得比较好得方法,有其他方法,我在添加上