在iframe中加载脚本时,IE9会抛出异常。为什么?

时间:2011-12-05 17:23:20

标签: javascript asp.net-mvc model-view-controller iframe internet-explorer-9

前提条件:

我有一个内嵌iframe的aspx页面。这个iframe指向MVC在同一站点(它的混合站点,标准ASP.NET和ASP.NET MVC)处理的url。由MVC呈现的结果页面包含许多脚本引用。

问题:

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

Error: 'Function' is undefined

也就是说,它说每个窗口最基本的东西都不存在。点击完所有这些弹出窗口后,页面就会按照设计工作! 如果我直接在浏览器中加载<iframe /> src属性中的URL,则一切都按预期工作 如果我在另一个浏览器中打开页面(我试过Opera,Firefox),一切都按预期工作 - 没有错误。

那么,IE9想要什么?

6 个答案:

答案 0 :(得分:28)

关于此错误(或功能)有this msdn page

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

通常,您应该创建元素,仅将<{1>}属性设置为一次,然后将其放在DOM树中一次。它与在iframe中运行的代码无关。

答案 1 :(得分:2)

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

  • 您在iframe中加载脚本代码
  • 脚本代码提前运行(从头部或身体顶部)
  • IE抱怨某些遗失的原生对象

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

另见这个问题: Error in Internet Explorer 9 (not earlier versions or other browsers) when including jQuery in an iframe

答案 2 :(得分:2)

将以下脚本块放在iFrame html&lt; head&gt;的最顶部似乎在我的情况下解决了这个问题。基本上,它强制iframe重新加载,正如一些人已经指出的那样,它解决了这个问题。它似乎相对安全,因为没有“对象”这样的东西。和&#39;日期&#39;,javascript基本没用。

<script type="text/javascript">
    if(typeof(Object)==="undefined"){
        window.location.reload();
    }
</script>

答案 3 :(得分:1)

尝试在加载完整网页后加载javascript。我觉得即使在iframe完全加载之前脚本也在执行。

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

答案 4 :(得分:1)

进一步的调查显示,解决方法是在设置'src'属性之前将违规的iframe添加到它的dom位置。

设置'src'后,更改DOM堆栈中iframe的位置会强制IE9进行垃圾收集。

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

通常情况下,像对话框和灯箱这样的插件会填充一个iframe,其中src已经设置到dom中,然后追加/ prepend或其他任何内容,从而触发GC。

答案 5 :(得分:0)

function waitForjQuery(){
    if(typeof jQuery!='undefined'){
        //Do yor stuff!
    }
    else{
        setTimeout(function(){
            waitForjQuery();
        },500);
    }
}
waitForjQuery();