基於iframe的移動端嵌套


需求描述

上上周接到了新的項目,移動端需要做一個底部有五個導航,點擊不同的導航頁面主體顯示不同的頁面,其中兩個頁面是自己做,而另外三個頁面是引用另外三個網址,其中兩個網址為內部項目,另外一個為外部(涉及跨域)。

問題

考慮再三后最省時間成本的就是使用iframe,雖然在移動端使用,我的內心是很拒絕的,不過其他方案調研了下都不太符合現狀。每點擊一次加載一個新的iframe,比較懶,所以兩個新頁面也做成了iframe,在做的過程中出現了如下問題,這里總結一下:
1.嵌入的iframe頁面無法滾動
2.meta元素的ontent不一致,外部的頁面使用width=device-width,而引用的其中一個頁面的width=640,這導致那個頁面渲染的時候無法全屏縮小
3.ios下其中的一個頁面莫名其妙的擴大
4.iframe的頁面a標簽的錨點失效
5.當我點擊a加載了a的iframe頁面,在切換到b,這個時候b頁面字體莫名的變大
6.導航欄有個樣式要求,active的時候icon是為紅色的icon,其他狀態下則為灰色的。其中的一個需求為返回的時候從哪里點出去返回到哪里
7.某個安卓機后返回無法重新加載iframe

解決

聲明嵌入的iframe頁面其中4個都是內部項目,同源的,所以大部分處理的問題不存在跨域問題。

1.嵌入的iframe頁面無法滾動

在iframe外層包裹一個div,然后將其設置為可滾動

<div style="webkit-overflow-scrolling: touch;overflow-y: scroll;">
	<iframe></iframe>
</div>

並且在禁止瀏覽器的默認行為,不然類似於微信滑動到底部的時候會和回彈的效果進行沖突

$('body').on('touchmove',function(e){
	e.preventDefault();
});

2.meta元素的ontent不一致

這個暫時沒有好辦法,iframe渲染的meta也是默認走的最上層的meta,所以他自己的內部meta是失效的,由於該項目屬於自己部門,有權限可以修改代碼,所以最后我重新設置該頁面的meta,重寫了這個頁面的樣式。

3.ios下其中的一個頁面莫名其妙的擴大

經排查我發現對於標題這類的設置了white-space:nowrap, 以及iframe頁面用了swiper設置的寬度為100%,而移動端為了自適應body也設置的為100%這種情況下,ios下iframe而里面的頁面會擴大。
我的解決辦法是在原項目下頁面html,body依舊設置為100%,而初始化的時候js獲取屏幕的寬度再設置body的寬度。

4.iframe的頁面a標簽的錨點失效

若iframe不涉及跨域,網上有兼容代碼可以重新設置a標簽,跨域解決不了,因為跨域的情況下,外部頁面是無法獲取到iframe下的元素的,最后這個導航做了外部跳轉。

5.iframe頁面切換的時候,切換后的頁面樣式莫名變大

之前我做頁面切換,是用過不重新加載iframe,而是直接修改了iframe的url,但是好像在這種情況下,可能之前上一個頁面加載的css沒有完全清除掉,所以導致css混亂。所以最后每次切換的時候,豆漿iframe給remove掉,在append加載新的iframe。

6.頁面點擊跳轉之后,返回的狀態標記

使用了localStorage記錄了url,navIndex

7.某個安卓機后返回無法重新加載iframe

返回后再append的iframe的代碼下再讓其重新渲染下

$("#iframe").attr("src",url).ready()

8.其他

獲取iframe內部元素

document.getElementById('iframe').onload = function(){
let doc = document.getElementById('iframe').contentDocument;
 }

中間涉及到了跨域請求,但是由於后台接口之前就寫了,無法修改接口,但是傳過來的時候中文亂碼

接口默認的解析為gbk,所以需要設置scriptCharset: 'gbk',

$.ajax({
	type: "GET",
	url: url,
	dataType: "jsonp",
	jsonp: "callback",
	jsonpCallback: "data_callback",
	contentType: "application/x-javascript,charset-type=gbk",
	scriptCharset: 'gbk',
	crossDomain: true,
	success: function (json) {});
});

我的博客即將搬運同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM