问题 在iframe中包含jQuery时,Internet Explorer 9(不是早期版本或其他浏览器)出错


基本上我有一个页面,推出了一个fancybox iframe。在那个iframe我也包括jQuery。但是,当我在Internet Explorer 9中测试它时,它给了我错误

行:68 \ n错误:'对象'未定义

此错误存在于文件中 jquery-1.4.1.js 这条线是第二行:

// Save a reference to some core methods
toString = Object.prototype.toString,
hasOwnProperty = Object.prototype.hasOwnProperty,
push = Array.prototype.push,
slice = Array.prototype.slice,
indexOf = Array.prototype.indexOf;

这是最后一行 var jQuery = function( selector, context ) {

如果我在兼容性视图中没有问题,在任何其他浏览器中都没有问题,只有Internet Explorer 9在Internet Explorer 9模式和Internet Explorer 9标准中。如果我忽略错误,我发现使用任何版本的jQuery都没有问题。

怎么了,我能做些什么来解决?


10948
2018-06-30 00:59


起源

将jQuery更新到最新版本 - CoolEsh
将jquery更新为1.6.1,现在错误在第81行,相同 toString = Object.prototype.toString 代码虽然。 - invertedSpear
当你直接打开iframe的内容时会发生什么?也就是说,如果您只是自己打开iframe页面? - jimbojw
@jimbojw:不,先生,如果加载在自己的窗口中,iframe中的代码会无错运行。 - invertedSpear
我很好奇是否在设置src属性之前或之后创建了iframe。如果创建了iframe,然后/ /设置了src属性,则可能是个问题。 (而不是构建包含<iframe src =“blah”/>的HTML字符串,并将其批量注入带有innerHTML的元素中)。 - jimbojw


答案:


当我从iframe中删除SRC属性并将onOpen事件添加到jQuery的对话框时,问题得到解决:

open: function()
  {
    document.getElementById("mainFrame").src = "/login.aspx";
  }

8
2017-07-28 14:52



Fancybox动态创建iframe。我不知道如何在这个过程中使用它。 - invertedSpear
谢谢!这似乎也解决了我的问题。 - GregL
您可以使用此方法与Fanybox一起使用 onComplete 事件。 - palmsey


我有同样的问题,但我的原因是不同的。我想我会在这里分享,以防其他人和我在同一条船上 - 特别是考虑到我花了大约4个小时追踪......

我们的主页有一个iframe,最终在很短的时间内将src属性改变了两次(我们实际上是偶然加载了两次相同的src - 一次直接在HTML中,然后再次通过JavaScript加载页面)。我不确定为什么Internet Explorer 9会窒息,但我猜这个框架部分是通过在再次设置src时初始化其脚本,将JavaScript引擎置于不愉快的状态。无论哪种方式,我很高兴我找到它,因为我们不应该加载框架两次!

然而,Internet Explorer 9死得如此糟糕的真正原因是一个谜。


3
2017-09-15 23:35





这是一个相关的问题: 在iframe中加载脚本时,IE9会抛出异常。为什么?

在iframe的早期(在head部分)加载脚本的某些情况下,Internet Explorer中似乎存在一些真正的问题,其中本地全局对象(例如“Function”和“Object”)未定义。

我在另一个问题上放了一笔赏金以获得更多的关注。

根据经验,我知道这个问题在IE8中也存在,但它似乎更为罕见。看起来在IE9中它变得更糟......


2
2017-12-30 14:19





噢,我以为我有最新的花式盒子。事实证明我有1.3.1,1.3.4解决了这个问题。

UPD(sompylasar): 实际上,这已在1.3.2中修复(参见 更新日志)。我比较了 源代码1.3.2 同 1.3.1 并找到了解决问题的以下区别:

content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank');

哪里 isIE6 评估为:

isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,

在删除之前应该执行此代码段 iframe 来自DOM。


2
2017-08-05 19:28



强大的精湛侦探工作在那里闷闷不乐。事实上,您应该将其作为一个新答案提交,而不是更新我的答案,这样您就可以得到您应得的信用额度。 - invertedSpear