vue中使用iframe是很常見的操作,但是在使用過程中可能會遇到一些問題,下面我們來一一解決。
第一個問題是iframe加載不出來。這是因為vue的模板渲染是異步的,而iframe的加載是同步的,導致iframe在模板渲染完之前就已經開始加載了。那么解決方法就是使用vue的nextTick方法,在模板渲染完之后再去加載iframe。
mounted(){ this.$nextTick(() =>{ this.$refs.iframe.src = 'https://www.baidu.com'; }) }
第二個問題是跨域訪問被拒絕。這是因為瀏覽器的同源策略限制了跨域訪問。我們可以使用postMessage方法來跨域通信,父頁面向子頁面發送消息,子頁面接收到消息后再將結果返回給父頁面。
//父頁面 mounted() { this.iframeWindow.postMessage('hello', 'https://www.baidu.com'); }, methods:{ receive(event) { console.log(event.data); } }, created(){ window.addEventListener('message', this.receive, false); } //子頁面 mounted() { window.addEventListener('message', (event) =>{ if (event.origin !== 'https://www.baidu.com') return; event.source.postMessage('world', event.origin); }, false); }
第三個問題是動態改變iframe的高度。這是因為iframe的高度無法獲取到,但是我們可以通過監聽iframe內部的內容變化來動態改變iframe的高度。
mounted() { this.$nextTick(() =>{ const iframe = this.$refs.iframe; const height = iframe.contentDocument.body.scrollHeight; iframe.style.height = height + 'px'; }); }, created() { window.addEventListener('resize', this.resetIframeHeight); }, methods: { resetIframeHeight() { const iframe = this.$refs.iframe; const height = iframe.contentDocument.body.scrollHeight; iframe.style.height = height + 'px'; } }, beforeDestroy() { window.removeEventListener('resize', this.resetIframeHeight); }
以上就是關于vue iframe問題的解決方法,希望對大家有所幫助。