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

时间:2011-12-06 23:23:30

标签: javascript override

我有一个功能,在我需要覆盖的不同帧中。另外,我需要从我的覆盖中调用原始函数。为此,我使用以下内容:

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

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

当我执行此代码时,我得到“无法从释放的脚本执行代码”。

思考?有一个更好的方法吗?在IE 6,7,8和9中进行测试。

3 个答案:

答案 0 :(得分:4)

你发现,你不能在IE中做到这一点。您需要确保在帧之间传递的任何对象都是字符串等本机内容。甚至“日期”实例也给我带来了问题,尽管那是在当天晦涩的Windows 2000版本上。

通过“释放脚本”,IE意味着您的页面上下文中某个对象“已经”被新页面覆盖了。

答案 1 :(得分:2)

我找到了解决方案。

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

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

因为代码现在位于目标框架内,所以它不会超出范围,我们不会再出现“已释放”错误。

答案 2 :(得分:2)

如果您从谷歌来到这里并正在寻找一个简单的解决方案来解决IE中的这个问题:

在我们的案例中出现了问题,因为我们正在使用iframe之间的事件。通过这样做,有可能在更改iframe内容并结合触发事件时,它将尝试在现在更改的iframe文档上调用脚本。这引起了有争议的例外。

添加

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

问题将不复存在。最后没有尝试/捕获因为IE。