Iframe嵌入跨域頁面高度自適應實現詳解
專案中要在頁面中嵌入通過富文字編輯器編輯的html內容子頁面,預想可通過兩種方式實現:
方式一:是將內容子頁面的html程式碼通過vue v-html方式渲染到主頁面的div下;
方式二:通過在主頁面嵌入iframe頁面實現;
兩種方式都進行了驗證,並且都遇到問題:
方式一問題:可以渲染出子頁面html內容,但是丟失css樣式,引入ckeditor的標準樣式css後,絕大部分樣式問題解決,但通過標籤選擇器指定的樣式會受主頁面樣式的干擾,導致子頁面內容在瀏覽器上無法還原實際顯示效果;
方式二問題:iframe方式可以很輕易的載入出子頁面內容,但由於子頁面與主頁面之間跨域,所以主頁面無法獲取到iframe子頁面的document,從而無法獲取子頁面的實際高度,顯示效果無法達到預期。
經過比較果斷選取方式二來解決,那麼如何解決跨域獲取iframe子頁面高度,並實現iframe自適應子頁面高度的問題呢?
最終採用iframe子頁面通過postMessage方式解決問題,具體如下:
1)子頁面onload完成後通過postMessage方式將實際頁面高度通知給父頁面;
var ele_height = element.offsetHeight;
console.log("Size: " + ele_height);
if(this.frameMode) {
let _resizeMsgObj = {
type: "resize",
data: {
height: ele_height
}
};
top.postMessage(JSON.stringify(_resizeMsgObj), '*');
2)父頁面監聽訊息,並在接收到訊息後調整iframe高度;
html程式碼:
<div class="com_right_content" style="height: auto;">
<iframe style="width: 100%;height:800px;"
:src="detailPreviewMediaInfo.webviewurl"
frameborder="0"
scrolling="no"
id="contentIframe">
</iframe>
</div>
js程式碼:
window.addEventListener('message', function(event){
console.log(`received message: `, event.origin, event.data)
let msgdataStr = String(event.data)
if(msgdataStr.indexOf("resize") != -1){
console.log(`received iframe resize message: `, event, event.data)
let msgdata = JSON.parse(msgdataStr)
document.getElementById('contentIframe').style.height = msgdata.data.height + 'px'
}
}, false);
補充說明:
由於父頁面不知道子頁面的高度,先將iframe高度設定為0px,接收到子頁面訊息後再將iframe高度設定為實際高度,發現iframe載入需要較長時間,原因是子頁面onload事件是在整個頁面全部載入完成後才觸發,包括頁面所有js、css、圖片檔案的載入,但圖片載入需要較長時間,所以iframe載入時間過長,影響使用者體驗,但在圖片載入完之前子頁面的高度又可能不準確,因此在父頁面在初始時給iframe設定一個高於一屏的高度,可以較好的解決使用者體驗問題。
相關文章
- iframe 跨域高度自適應跨域
- jquery 實現iframe 自適應高度jQuery
- jquery實現的iframe高度自適應效果jQuery
- iframe高度自適應解決方案
- html iframe高度自適應HTML
- javascript實現的iframe高度自適應程式碼JavaScript
- [轉]利用location.hash實現跨域iframe自適應高寬跨域
- ajax應用實現iframe高度自適應程式碼例項
- jquery實現的iframe高度自適應程式碼例項jQuery
- iframe自適應高度的外掛
- textarea高度自適應詳解
- 原生javascript實現的iframe高度自適應程式碼例項JavaScript
- 自動載入的iframe高度自適應
- iframe高度自適應程式碼例項
- <iframe>高度自適應程式碼例項
- 如何獲取跨域iframe高度跨域
- 真正解決iframe高度自適應問題
- 實現iframe內容的自適應
- 最新Iframe全瀏覽器相容自適應高度解決方案瀏覽器
- Vue嵌入iframe,iframe如何跨域呼叫vue內路由Vue跨域路由
- iframe之間通訊問題及iframe自適應高度問題
- js獲取iframe和父級之間元素,方法、屬,獲取iframe的高度自適應iframe高度JS
- 前端頁面高度和寬度自適應怎麼做?前端
- textarea實現高度自適應的理解
- Iframe內部頁面高度賦值於其父頁面的Iframe標籤賦值
- 詳細實現微信輸入框效果(textView自適應文字高度)TextView
- easyui 中iframe巢狀頁面,大彈窗自適應居中的解決方法。$('#win').window()UI巢狀
- css實現左欄固定右欄自適應,高度自適應的佈局CSS
- 使用iframe內嵌網頁的時候,如何做到內嵌網頁的高度自適應 有大用網頁
- 手機端頁面自適應解決方案
- 實現一個高度自適應的輸入框
- 奇技淫巧話前端:使用 iframe 實現與父頁面跨域隔離的 JavaScript 程式碼沙箱前端跨域JavaScript
- [DIV+CSS] IE6浮出層穿透解決方案中的iframe高度自適應CSS穿透
- 直播平臺開發,scroll-view如何自適應頁面剩餘高度View
- CSS 圖片固定長寬比實現高度自適應CSS
- TabelViewCell高度自適應View
- 配合Masonry實現TableViewCell的高度自適應,以及更易管理的高度快取View快取
- 短視訊商城系統,scroll-view如何自適應頁面剩餘高度View