背景

因为历史原因,之前很多的系统都会是 顶级页面+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强制标准模式---标准模式与兼容模式设置

IE 兼容模式 设置 Meta Compatible 和 Iframe 子页面的关系的更多相关文章

  1. $.contents().find设置的data在iframe子页面无法获取值

    <iframe src="iframe16.html" id="iframe16" name="iframe16"></i ...

  2. 获取iframe子页面内容高度给iframe动态设置高度

    <!DOCTYPE html><html> <head> <meta charset="UTF-8" /> <meta nam ...

  3. js 在iframe子页面获取父页面元素,或在父页面 获取iframe子页面的元素的几种方式

    用JS或jquery访问页面内的iframe,兼容IE/FF 注意:框架内的页面是不能跨域的! 假设有两个页面,在相同域下. index.html 文件内含有一个iframe: XML/HTML代码 ...

  4. Js获取iframe子页面全局变量

    项目中通过iframe内嵌了一个子页面,子页面定义了一些全局变量,父页面需要获取子页面的全局变量,做了一些测试(我的环境IE10和Firefox32.0.3),得出如下结论: IE下: window. ...

  5. Js动态获取iframe子页面的高度////////////////////////zzzz

    Js动态获取iframe子页面的高度   Js动态获取iframe子页面的高度总结 问题的缘由 产品有个评论列表引用的是个iframe,高度不固定于是引发这个总结. 方法1:父级页面获取子级页面的高度 ...

  6. iframe子页面position的fixed

    前言: 首先说一说我昨天天的苦逼经历.中午吃饭时一同事跟我说,他做的项目嵌套iframe后,子页面的position设置fixed失效了. 经过反复询问,得知他用了两层iframe,再加上最外的父页面 ...

  7. js之iframe子页面与父页面通信

    iframe子页面与父页面通信根据iframe中src属性是同域链接还是跨域链接,通信方式也不同. 一.同域下父子页面的通信 父页面parent.html <html> <head& ...

  8. vue 给嵌套的iframe子页面传数据 postMessage

    Vue组件下嵌套了一个不同域下的子页面,iframe子页面不能直接获取到父页面的数据,即使数据存在localStorage中,子页面一样是获取不到的,所以只好使用postMessage传数据: < ...

  9. JS中iframe子页面与父页面之间通信

    iframe子页面与父页面通信根据iframe中src属性是同域链接还是跨域链接,通信方式也不同. 一.同域下父子页面的通信 父页面parent.html <html> <head& ...

随机推荐

  1. Unity string 转换为 Quaternion

    public Quaternion QuaternionParse(string name) { name = name.Replace("(", "").Re ...

  2. 数据库mysql--基础命令

    客户端 一.登录和退出 1.登录 mysql -h server-ip -u usename -p 回车,然后会提示输入密码 2.退出:"quit;" | "exit;& ...

  3. 怎么查找Linux系统调用

    目前都是这么找: git grep SYSCALL_DEFINE | grep signal系统调用的函数名本来是叫sys_xxx,现在都是用宏SYSCALL_DEFINE(XXX),搞得无法找到sy ...

  4. ubuntu下搭建android开发环境核心篇安装AndroidStudio、sdk、jdk

    本文系转载http://blog.csdn.net/lsyz0021/article/details/52215996 一.安装前的准备 1.1.如果你还没有安装ubuntu 14.04 LTS系统, ...

  5. Windows 10家庭版升级到专业版,系统蓝屏

    Log Name: SystemSource: Microsoft-Windows-DistributedCOMDate: 9/9/2018 7:56:57 PMEvent ID: 10016Task ...

  6. Kudu的Using Apache Kudu with Apache Impala(官网推荐的步骤)

    不多说,直接上干货! http://kudu.apache.org/docs/kudu_impala_integration.html http://blog.csdn.net/lovebyz/art ...

  7. java多线程之原子变量

    看链接博客:http://blog.csdn.net/u011116672/article/details/51068828

  8. pat1043. Is It a Binary Search Tree (25)

    1043. Is It a Binary Search Tree (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

  9. 【Ionic】---$ionicLoading ion-spinner SVG旋转加载的动画图标

    ionic 加载动作 $ionicLoading $ionicLoading 是 ionic 默认的一个加载交互效果.里面的内容也是可以在模板里面修改. 用法 angular.module('Load ...

  10. Oracle 数据库 导入导出空表解决办法!

    expdp导出:(打开CMD) 先创建(任意盘符):\oracle_data 文件夹 1.sqlplus / as sysdba;2.create or replace directory d_nam ...