IE 相容模式 設置 Meta Compatible 和 Iframe 子頁面的關係

来源:https://www.cnblogs.com/xakoy/archive/2018/07/13/9304429.html
-Advertisement-
Play Games

背景 因為歷史原因,之前很多的系統都會是 頂級頁面+Iframe來載入子級頁面的這種模式構件系統,而且系統都只能運行在IE6或者IE 高版本相容模式下(IE 7模式)。 隨著現在的審美原來越高,腳本能里越來越強,無論是用戶和是軟體商都希望能系統升級,那麼在升級的過程中,肯定是要保證原有的系統能正常運 ...


背景

因為歷史原因,之前很多的系統都會是 頂級頁面+Iframe來載入子級頁面的這種模式構件系統,而且系統都只能運行在IE6或者IE 高版本相容模式下(IE 7模式)。 隨著現在的審美原來越高,腳本能里越來越強,無論是用戶和是軟體商都希望能系統升級,那麼在升級的過程中,肯定是要保證原有的系統能正常運行的。

通常的做法會是如下:

將頁面利用 html meta標簽,設置Compatible屬性,來使得無論用戶是否設置了相容模式,都讓當前網頁強勢使用最高版本瀏覽器模式,這樣可以讓我們界面利用一些css3的特性做出性能更好,更漂亮的網頁。也能使用更複雜的JS,更頁面增加更強的效果。

那麼可能會遇到以下幾種情況:

  1. 頂級頁面設置了Compatible, IE=Edge。 你會發現原來系統iframe能正常的網頁,在你新的頁面中運行不正常了,即便開啟了相容模式,或者iframe裡面的網頁設置了 Compatible, IE=EmulateIE7。你的頁面依然瀏覽不正常。
  2. 要解決上面的問題,就是頂級頁面不能設置Compatible, IE=Edge,你可以設置頂級頁面的Compatible, IE=EmulateIE8或IE=EmulateIE7,則可以讓iframe裡面的網頁瀏覽正常。
  3. 使用了第2步驟的解決方案,你會發現,當你新做的網頁,裡面用到了css3或者高版本的腳本庫如(vue.js),在測試IE9中很正常,但是將網頁簽入到iframe中後,頁面不正常,或者腳本報錯。這是因為當頂級頁面設置為IE=EmulateIE8或IE=EmulateIE7,iframe裡面的頁面設置IE=edge不起作用,它的文檔模式顯示的是IE8。

為什麼會出現這種情況呢?

原因和解釋

stackoverflow的一個問題《Trying to use IE=edge X-UA-Compatible in an iframe on a page using IE=EmulateIE7》, 有人給出了答案:

IE does not allow mixing IE9+ and older modes in a frame hierarchy. If your top document is IE7, the highest you can get in any inner document is IE8. Similarly, you wouldn't be able to host anything but IE9 mode docs inside an IE9 mode page.

上面的答案很通俗易懂,翻下大意如下:

在IE中不允許IE9+的模式和舊模式混合,如果頂級頁面的文檔模式是IE7,則你在iframe中的頁面最高級的文檔模式是IE8,同樣,頂級頁面的模式是IE9+,則iframe中的頁面文檔模式不可能低於IE9 以下。

這個答案和上面我們遇到的問題是完美契合的,我們也可以寫一些例子來證明這個答案,【例子 】放在附件中,可以下載更改Compatible測試驗證下。

csdn上也有人遇到了,這個問題,有同學回答和上面的一致,直通車《能不能讓iframe內外的頁面用不同的文檔模式解析》。

結論

當遇到背景當中的問題時,目前好像無解,只能設置頂級的網頁最高為IE8,然後所有的系統都必須相容IE8模式,想不支持IE8模式,只能當做外鏈來打開。所有如果要支持前有的系統,無論再過多少年,前端技術如何發展,你新做的系統,技術上也只能限定在IE8支持才情況下。

該如何考量這個問題,還需要從業務、和遷移策略上改變,可以考慮如下幾種方式:

  1. 升級頂級的頁面支持最高版本瀏覽器支持,那些需要相容模式才能運行的系統,考慮是否使用外鏈的方式打開。
  2. 保留原有的頂級頁面,做一個新的頂級頁面,在頂級頁面打開的那些系統時,提示用戶去舊的平臺打開,並給出鏈接,這種做法會失去一些用戶體驗,怎麼樣儘量讓用戶體驗更好,就要發揮各自的聰明才智了。
  3. 直接使用兩個平臺,一個平臺是就有的系統,一個平臺是新的系統。

各位看官,有什麼好的想法可以提提。

參考:

  1. Specifying legacy document modes
  2. Trying to use IE=edge X-UA-Compatible in an iframe on a page using IE=EmulateIE7
  3. 使用X-UA-Compatible來搞定IE瀏覽器相容模式
  4. IE強制標準模式---標準模式與相容模式設置

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一. 什麼是消息隊列? 消息(Message)是指在應用間傳送的數據。消息可以非常簡單,比如只包含文本字元串,也可以更複雜,可能包含嵌入對象。 消息隊列(Message Queue)是一種應用間的通信方式,消息發送後可以立即返回,由消息系統來確保消息的可靠傳遞。消息發佈者只管把消息發佈到 MQ 中而 ...
  • // my.js function $(id){return document.getElementById(id)};function show(obj){obj.style.display = "block"};function hide(obj){obj.style.display = "no ...
  • 最近項目中客戶需要實現身份證識別功能,合理計划了之後決定使用百度ai的身份證識別。 身份證識別是文字識別的一種,類似的功能有很多比如駕駛證識別等等,原理都是相同的。 對於前端初學者來說,如果要實現這種功能靠頁面,js是實現不了的,可以確定地說就是讓後臺配合實現。實現過程是上傳一張圖片給後臺,後臺使用 ...
  • https://www.zhangxinxu.com/wordpress/2017/07/js-text-string-download-as-html-json-file/ 侵刪 1.H5 download屬性 downFile(下載地址, 保存名稱); 2.iframe方式 3.form方式 ...
  • Element表單驗證(1) 首先要掌握Element官方那幾個表單驗證的例子,然後才看下麵的教程。 Element主要使用了 "async validator" 這個庫作為表單驗證 主要分成三部分 Validate Options Rules 其中,對於我們使用Element的來說,Rules最重 ...
  • 響應式 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 ... ...
  • function Obj(){} Obj.prototype={ scroll:function(){ /* 主要是做相容處理 這裡必須時!=null 因為預設值和每次滾動的時侯 都可以值為0 但是 if(0)為假 所以就只要不為null 就執行 ... ...
  • 仿Jquery查詢 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...