IE9 在 iframe 中加载脚本时抛出异常。为啥?

Posted

技术标签:

【中文标题】IE9 在 iframe 中加载脚本时抛出异常。为啥?【英文标题】:IE9 throws exceptions when loading scripts in iframe. Why?IE9 在 iframe 中加载脚本时抛出异常。为什么? 【发布时间】:2012-01-13 10:13:59 【问题描述】:

前提条件:

我有一个带有 iframe 的 aspx 页面。此 iframe 指向由 MVC 在同一站点上处理的 url(它是混合站点,标准 ASP.NET 和 ASP.NET MVC)。 MVC 渲染的结果页面包含大量脚本引用。

问题:

IE9 在 iframe 中加载的每个脚本都会引发异常。这些例外与此类似:

Error: 'Function' is undefined

也就是说,它说每个窗口所拥有的最基本的东西不知何故缺席。单击所有这些弹出窗口后,页面就会按设计工作! 如果我直接在浏览器中从<iframe /> src 属性加载 URL,一切都会按预期工作。 如果我在另一个浏览器中打开该页面(我尝试过 Opera、Firefox),一切都会按预期运行——没有错误。

那么,IE9 想要什么?

【问题讨论】:

无论 IE9 想要什么,它都会想要,从 我们 想要 代码和精确的错误消息这一事实判断。 "function" 在 javascript 中没有大写字母 F。是这个问题吗? 没有。 Function Global Object @Jon 这是 IE 抱怨缺少“本机”对象。减少案件是非常困难的。我知道,因为我去过那里。 @Diodeus 正如 Eugene 所说,这不是关于 function 关键字,而是关于 Function 全局对象。它们是有区别的。这也使得搜索该主题非常困难,因为 google 等不区分大小写 【参考方案1】:
function waitForjQuery()
    if(typeof jQuery!='undefined')
        //Do yor stuff!
    
    else
        setTimeout(function()
            waitForjQuery();
        ,500);
    

waitForjQuery();

【讨论】:

这如何回答这个问题?它甚至似乎不适用于这个问题【参考方案2】:

进一步调查显示,解决方案是在设置“src”属性之前将有问题的 iframe 添加到其 dom 位置。

一旦设置了“src”,更改 iframe 在 DOM 堆栈中的位置会强制 IE9 对其进行垃圾回收。

一旦设置了 'src',iframe 可以通过 css 定位来调整大小和更改,但不能更改 DOM 堆栈中的相对位置。

通常,对话框和灯箱之类的插件会将已设置 src 的 iframe 填充到 dom 中,然后追加/前置或其他任何内容,从而触发 GC。

【讨论】:

【参考方案3】:

将以下脚本块放在 iFrame html

的最顶部似乎可以解决我的问题。基本上,它强制 iframe 重新加载,正如一些人所指出的,这解决了这个问题。它似乎相对安全,因为没有“对象”和“日期”之类的东西,javascript 基本上是无用的。
<script type="text/javascript">
    if(typeof(Object)==="undefined")
        window.location.reload();
    
</script>

【讨论】:

【参考方案4】:

在加载完整网页后尝试在最后加载 javascript。我觉得脚本甚至在 iframe 完全加载之前就在执行。

对于在 IE9 中编写脚本的一些建议,请查看下面的给定链接 http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more.aspx

【讨论】:

【参考方案5】:

this msdn page 关于这个错误(或功能)。

当您在 DOM 中移动 iframe 元素时,您会遇到此类错误。在这种情况下,IE 9 垃圾会收集 iframe(导致未定义的错误)并将其重新加载到另一个位置。

一般来说,您应该创建元素,仅设置其src 属性once,然后将其放在 DOM 树中的某个位置once。它与在 iframe 本身中运行的代码无关。

【讨论】:

+1 - 不到五个小时前我遇到了这个确切的问题,我在“工作”和“不工作”之间唯一改变的是一些在 DOM 中移动 iframe 的代码。删除那段代码解决了这个问题(我使用 z-index 来产生相同的效果)。 在这篇文章中找到了类似的答案:***.com/questions/5514973/… 我在度假,所以无法尽快回复,但这似乎是相关的。然而,在受影响的地区,它说这已经从 IE8 更改为 IE9,但我也看到了 IE8 中缺少的 API 行为......仍然恭喜获得赏金! :) 如果您使用 Knockout,请将您的 【参考方案6】:

我在野外也遇到过同样的情况。基本症状:

您在 iframe 中加载脚本代码 脚本代码提前运行(从头部或主体顶部) IE 抱怨缺少一些原生对象

我发现通常可以通过将脚本代码的执行延迟到 onload 或 DOMContentLoaded 来防止它...我知道帮助不大,但这是我遇到过的最困难的 IE 脚本错误之一。我给你的问题加分了,希望其他人也能找到,我们可以得到更详细的答案。

另请参阅此问题: Error in Internet Explorer 9 (not earlier versions or other browsers) when including jQuery in an iframe

【讨论】:

以上是关于IE9 在 iframe 中加载脚本时抛出异常。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

new ActiveXObject("Scripting.FileSystemObject") 时抛出异常 .

当 string.length() 为 0 时抛出异常

视图设置为 inputAccessoryView 在添加回普通视图时抛出异常

lyncClient.GetClient() 将 UISuppressionMode 设置为 1 时抛出异常

图像在 iframe 中加载后未从缓存中加载

将 pyspark df 转换为 pandas 时抛出的异常是等待结果