入坑
起源是使用vue的ssr框架nuxt.js中遇到的需求,在要求seo的情况下,使用了此框架,但是需求是需要加载第三方或者自己写的html文件。但是需要使用共同的导航条和页脚。由于不能使用组件化,所以想到了iframe嵌入的解决方案。
本地页面
因为nuxt.js架构中可以直接访问static文件中的静态文件,所以我就把静态文件放入到了这个文件夹,然后也实现了嵌入的功能,主要的处理就是嵌入页面自适应网页的高度,简单处理代码如下:
html
<iframeid="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.parentWindowif (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自由通信,这是我觉得比较好得方法,有其他方法,我在添加上
