无法从已释放的脚本中执行代码

3

我有一个函数在另一个框架中,我需要进行覆盖。此外,我需要在我的覆盖中调用原始函数。为此,我使用以下代码:

myFrame.SomeFunction = (function () {
    var originalSomeFunction = myFrame.SomeFunction;

    return function(arg1, arg2, arg3) {
        alert('In override!');
        originalSomeFunction(arg1, arg2, arg3);
    };
})();

当我执行这段代码时,会出现“无法执行已释放脚本的代码”的错误提示。想法是什么?有没有更好的方法来解决这个问题?在测试中使用IE 6、7、8和9。

在我的Firefox、Chrome和IE浏览器上都能正常工作。你用的是什么浏览器?可能是你代码中的其他部分引起了这个问题。 - Gabriele Petrioli
1
当您尝试访问该帧时,该帧很可能已不再存在。请参见:https://dev59.com/JHVD5IYBdhLWcg3wHnwX - Wayne
我需要知道“freed script”是什么意思! - Pierre
3
伙计们,"freed script" 是我从IE收到的错误信息的一部分。如果你不知道 "freed script" 是什么意思,请不要回答我的问题。 - RMD
只是澄清一下,在这个执行过程中,“myFrame”并没有重新加载。 - RMD
1
在这个上下文中,“freed”意味着从内存中释放,因此被删除/丢失。我从@iwburk的评论中发现了这一点。 - Dead.Rabit
4个回答

4

你发现在IE中无法做到这一点。你需要确保在帧之间传递的任何对象都是本地对象,如字符串。即使是“Date”实例也会给我带来问题,尽管那是在过去Windows 2000的某些版本上。

所谓的“freed script”,IE指的是一个对象“出生”的页面上下文已被新页面覆盖。


那么在IE中没有办法覆盖不同框架中的函数吗?奇怪的是,即使我使用“myFrame”中的变量来保存函数指针,我仍然会得到这个错误。 - RMD
可以,但是问题出现在当你有一个“陈旧”的对象,它诞生于另一个页面时。一旦你的代码试图触及它,IE就会意识到它的原型对象(等等)已经不存在了。这似乎是JScript机制的工作方式。 - Pointy
我的代码中代表“过期”对象的是什么?我该如何修改这段代码以防止这种情况发生? - RMD
很可能与页面之间传递的内容有关。或者,如果您在另一个框架中覆盖该函数,然后覆盖该函数的框架被覆盖。现在,如果您的框架完全静态,并且从服务器上永远不会重新加载新页面,那么这对我来说是一个新问题。 - Pointy

3
如果你从谷歌搜索进入这里寻找在IE中解决这个问题的简单方法:
我们遇到这个问题是因为我们在iframe之间使用事件。通过这样做,当更改iframe内容和触发事件时,它会尝试调用现在已更改的iframe文档上的脚本,引发了这个异常。
通过添加 "

"
$(window).on("unload", function(){
    $(target).off(eventname, handler);
});

问题将不再被提出。最后,由于IE的存在,无需使用try/catch语句。

handler是可选的 - 因此,如果您可以清除目标元素上的所有jQuery单击处理程序,则可以执行(例如).off('click') - Stan

2

我找到了解决方案。

基本上,你需要将我之前发布的所有代码,并使用 eval() 函数从目标帧的上下文中执行它。因此...

myFrame.eval("SomeFunction = (function () {var originalSomeFunction = SomeFunction; return function (arg1, arg2, arg2) {alert('Inside override!'); originalSomeFunction(arg1, arg2, arg3);};})();");

由于代码现在位于目标框架内,它不会超出作用域,因此我们不再收到“已释放”的错误。


0

我知道这个问题很老了,但如果你遇到了这个问题,我建议你使用JSON.parse在父框架上创建一个对象,而不是使用eval,因为eval是邪恶的(会导致安全问题,我认为现在某些浏览器默认禁用它)

例如,如果你想在第1帧上调用someFunction,并传递一个JSON对象,可以使用以下代码:

var frame = window.frames[1];
frame.someFunction( frame.JSON.parse( '{ "attr": 7 }' ) );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接