【问题标题】:Javascript version inside iframe in IE9IE9 中 iframe 中的 Javascript 版本
【发布时间】:2011-10-04 16:14:42
【问题描述】:

我有一个将 Outlook Web 应用程序放入 iframe 的 Web 应用程序。 这在大多数浏览器中运行良好,但在 IE9 中失败,并在 Outlook 的 javascript 中出现错误:

SCRIPT438: Object doesn't support property or method '__defineGetter__' 
uglobal.js, line 1 character 975667

似乎正在发生的事情是 __defineGetter__ 函数已被弃用并且在 IE9 中不存在,尽管大多数其他浏览器都支持它。邮件应用程序通常在 IE7 标准模式下运行 - 如果我自己打开网络邮件并按 F12(开发工具)我会看到 Browser Mode: IE9, Document Mode: IE7 standards 并且没有问题。

但是,当我在 iframe 中运行包含 Outlook 邮件的应用程序时,我看到 Browser Mode: IE9, Document Mode: IE9 standards。这适用于外部站点,没有明显的方法可以找出 iframe 在 IE9 中的呈现方式。

帧源具有我期望的标题:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "ht`tp://www.w3.org/TR/html4/strict.dtd">

看起来 iframe 中的 JavaScript 正在运行,就好像它与版本无关。当然它仍然是孤立的,所以我不能按照this hack 对这个函数进行猴子补丁。

如何强制 iframe 内容以 IE7 模式运行 JavaScript,与网站的其他部分不同?我们不想编辑 iframe 中的代码?我们不想这样做,因为它只是股票展望网络应用程序。如果我们必须去那里,我们只会去修复他们的 JavaScript 而不是修复元数据。

【问题讨论】:

    标签: javascript internet-explorer iframe internet-explorer-9


    【解决方案1】:

    我会根据我们今天所知道的来回答我自己的问题。 我们基本上已经陷入了一些不受欢迎的功能的恶意交互中。

    1) 根据this post,IE9 会忽略 iframe 内页面的 doctype,而始终使用父页面的 doctype。

    IE9 强制子页面使用与父页面相同的 DOCTYPE。不 有什么关系。 ...微软的回应是它正在按设计工作。

    我希望有人能证实或否认这一信息,一个论坛帖子没什么可继续的,但它与我们所看到的相符。

    2) MS Outlook 网络应用程序 2011 版(版本:14.1.287.0)与 Internet Explorer 9 不兼容。要显示这一点,请尝试以下操作:查找正在运行的 Outlook 网络应用程序,例如http://mail.mycompany.com 用 IE9 连接它。登录。按 F12 调出开发者工具。请注意,右上角有“文档模式:IE7 标准”。 IE9 正在模拟 IE7 以运行该站点。

    您可以更改此模式:单击它并选择“文档模式:IE9 标准”。请注意,Console 选项卡现在显示上面提到的关于缺少 __defineGetter__ 方法的错误,并且 Web 应用程序的某些部分不起作用 - 单击列表中的消息或单击回复按钮现在什么都不做。

    感谢 Outlook 团队不使用标准并且不针对您自己的浏览器的当前版本。

    3) __defineGetter__ 方法在 IE9 中不起作用。它已被弃用,应使用 defineProperty 代替。这很公平,但__defineGetter__ 仍然存在于当前版本的 Firefox 和 Chrome 中,因此 Outlook 可以正常工作。在 IE9 中它是不存在的,除非 IE9 假装是旧版本的 IE。

    【讨论】:

      【解决方案2】:

      您只需将此元数据放入您的页面/母版页:

      <meta http-equiv="X-UA-Compatible" content="IE=8" />
      

      Xam666

      【讨论】:

      • 我们最终做到了。它的主要缺点是它强制 IE9 在整个过程中表现得像 IE8 - 因此 IE 9 中的新功能被禁用。实际上,我们放弃了将任何版本的 IE 视为“现代浏览器”的任何伪装,并承认该网站只会在 Firefox 和 Chrome 中看起来最好。
      【解决方案3】:

      查看这些。元标记可以提供帮助

      http://blogs.msdn.com/b/askie/archive/2009/03/23/understanding-compatibility-modes-in-internet-explorer-8.aspx

      文档适用于 IE8。应该也给IE9指点。

      网页可以通过使用 Meta 标签或发送 http 标头来指定兼容模式。当两者都存在时,元标记优先于 http 标头。

      1) META 标签 - 您可以在网页的 HEAD 元素中放置以下 HTML 标签:

      2) HTTP 标头 - 您可以配置您的服务器,以便在每个页面发送以下 HTTP 标头

      X-UA 兼容:IE=7

      【讨论】:

      • 据我了解,这需要在 iframe 中编辑代码吗?我们不想这样做,因为它只是股票展望网络应用程序。如果我们必须去那里,我们可能只是去修复他们的 JavaScript。它也没有解释为什么 IE 不在 iframe 中但在其中失败时正确检测到它。
      猜你喜欢
      • 1970-01-01
      • 2011-07-27
      • 2011-02-07
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      相关资源
      最近更新 更多