背景

因为历史原因,之前很多的系统都会是 顶级页面+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. Mybatis学习笔记14 - 动态sql之foreach标签

    一.查询给定集合中员工id对应的所有员工信息 示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import ...

  2. TCP/IP协议<一>

    下面是协议层从底层至顶层的一个模型图: 一.计算机网络的背景 1.1 计算机的发展 有人说:“20世纪最伟大的发明就是计算机”,自诞生伊始,计算机经历了一系列发展,从大型通用计算机.超级计算机.小型机 ...

  3. jQuery的实现编码,解决特殊字符 <script> "

    function htmlEncode(value){ if (value) { return jQuery('<div />').text(value).html(); } else { ...

  4. 2.C#中的常用快捷键

    快速对齐代码: Ctrl+K+D:  快速对齐代码   (如果代码语法错误,就不能使用) Ctrl+Z:  撤销 Ctrl+S:保存   没事就Ctrl+S一下,防止因为电脑断电,代码全部丢失 Ctr ...

  5. hystrix应用介绍(一)

    声明:本文仅做个人的一次接口重构过程记录,期间参考了一些写的不错的博客,如果存在抄袭,请留言. hystrix基本介绍 hystrix 是一个开源的容灾框架,目的是为了解决当依赖服务出现故障或者接口响 ...

  6. js随堂初体验(一)

    Js初体验(-) 1 js的基础知识 A web三大标准:1 html:结构标准    2 css:表现标准  3 javascript:行为标准 B js三种书写方式:1 行内js:onclick ...

  7. GitHub webstorm 及 README.md 姿势

    README.md 语法格式: 规范的README文件开头都写上一个标题,这被称为大标题. 标题: #一级标题 ##二级标题 ###三级标题 ####四级标题 #####五级标题 ######六级标题 ...

  8. 【Android 界面效果48】Android-RecyclerView-Item点击事件设置

    在上一篇博客Android-RecylerView初识中提到,RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件 ...

  9. Android - 页面返回上一页面的三种方式

    今年刚刚跳槽到了新公司,也开始转型做Android,由此开始Android的学习历程. 最近在解很多UI的bug,在解bug过程中,总结了在UI的实现过程中,页面返回上一页面的几种实现方式. 一. 自 ...

  10. Mono For Android如何在VS2012 中打开设计界面

      刚接触 Mono For Android 没几天,不知不觉把设计界面弄丢了.辛辛苦苦才把设计界面弄出来,如果你在 Layout 下打开 *.xaml 的文件打开的却是 xml 文档,那么你可以按照 ...