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 跨域高度自適應跨域
- html iframe高度自適應HTML
- iframe自適應高度的外掛
- textarea高度自適應詳解
- 自動載入的iframe高度自適應
- 真正解決iframe高度自適應問題
- textarea文域高度自適應
- Vue嵌入iframe,iframe如何跨域呼叫vue內路由Vue跨域路由
- js獲取iframe和父級之間元素,方法、屬,獲取iframe的高度自適應iframe高度JS
- textarea實現高度自適應的理解
- 前端頁面高度和寬度自適應怎麼做?前端
- iframe 裡的高度適應的問題
- Iframe內部頁面高度賦值於其父頁面的Iframe標籤賦值
- 使用iframe內嵌網頁的時候,如何做到內嵌網頁的高度自適應 有大用網頁
- 非面試向跨域實踐詳解面試跨域
- textarea 高度自適應
- 奇技淫巧話前端:使用 iframe 實現與父頁面跨域隔離的 JavaScript 程式碼沙箱前端跨域JavaScript
- CSS 圖片固定長寬比實現高度自適應CSS
- 直播平臺開發,scroll-view如何自適應頁面剩餘高度View
- keycloak~從login-status-iframe頁面總結如何跨域傳值~續跨域
- 短視訊商城系統,scroll-view如何自適應頁面剩餘高度View
- 小程式Swiper高度自適應
- jQuery textarea框高度自適應jQuery
- iframe 元素跨域訪問跨域
- iOS初級開發學習筆記:一個頁面中自動計算cell的高度來自適應tableView的高度iOS筆記View
- Widget小元件如何自適應高度元件
- JQuery iframe頁面jQuery
- Flutter實現馬蜂窩小紅書自適應高度輪播圖Flutter
- Android XML靈活佈局之 EditText實現自適應高度同時限制最小和最大高度AndroidXML
- Vue跨域詳解Vue跨域
- http跨域詳解HTTP跨域
- 前端跨域詳解前端跨域
- 真正的讓iframe自適應高度 相容多種瀏覽器隨著視窗大小改變瀏覽器
- 微信輪播圖自適應高度
- 巢狀UITextView的UITableViewCell高度自適應巢狀UITextView
- 微信小程式Swiper高度自適應微信小程式
- easyui-layout佈局高度自適應UI
- iframe父子頁面通訊解決方案