什么导致错误“无法从释放的脚本执行代码”

我以为我刚才find了解决scheme(请参阅我的博客 ):

如果你得到的JavaScript(或应该是JScript)错误“无法从释放的脚本执行代码” – 尝试移动头部的任何元标记,以便他们在脚本标记之前。

…但基于最近的博客评论之一,我build议的修复可能不适合每个人。 我认为这将是一个很好的开放到StackOverflow社区….

导致错误的原因是“无法从释放的脚本执行代码”以及解决scheme/解决方法是什么?

这听起来像是你在处理某些标记的方式中遇到了一个错误/问题,或者你引用了正在尝试执行方法的已发布对象。

首先,我会在任何<script>标签之前移动任何<meta>标签,就像这里和其他许多地方所build议的那样。

然后检查是否存在此处讨论的页面/安全问题。

当您调用在不再存在的窗口或框架中创build的函数时,会出现此错误。

如果您事先不知道窗口是否仍然存在,您可以尝试/捕获以检测它:

 try { f(); } catch(e) { if (e.number == -2146823277) // f is no longer available ... } 

这个错误是在处理脚本的“父”窗口(即:closures)时引起的,但是引用了仍然保留的脚本(例如在另一个窗口中)。 即使“对象”仍然存在,它想要执行的上下文不是。

这有点肮脏,但它适用于我的Windows边栏小工具:

这里是一般的想法:'主'窗口设置一个函数,将评估一些代码,是的,这是丑陋的。 然后一个“孩子”可以调用这个“构build器函数”(它绑定到主窗口的范围/),并取回一个也绑定到“主”窗口的函数。 当然,一个明显的缺点是,被“反弹”的函数不能在它看起来被定义的范围内closures……无论如何,

这是部分伪代码,但是我在Windows Sidebar Gadget上使用它的一个变种(我一直这么说,因为Sidebar小工具在“无限制区域0”中运行,这可能会或可能不会)极大地改变场景。

 // This has to be setup from the main window, not a child/etc! mainWindow.functionBuilder = function (func, args) { // trim the name, if any var funcStr = ("" + func).replace(/^function\s+[^\s(]+\s*\(/, "function (") try { var rebuilt eval("rebuilt = (" + funcStr + ")") return rebuilt(args) } catch (e) { alert("oops! " + e.message) } } // then in the child, as an example // as stated above, even though function (args) looks like it's // a closure in the child scope, IT IS NOT. There you go :) var x = {blerg: 2} functionInMainWindowContenxt = mainWindow.functionBuilder(function (args) { // in here args is in the bound scope -- have at the child objects! :-/ function fn (blah) { return blah * args.blerg } return fn }, x) x.blerg = 7 functionInMainWindowContext(6) // -> 42 if I did my math right 

作为变体,主窗口应该能够将functionBuilder函数传递给子窗口 – 只要在主窗口上下文中定义了functionBuilder函数!

我觉得我用了太多的话。 因人而异。

如果您试图访问JS对象,最简单的方法是创build一个副本:

 var objectCopy = JSON.parse(JSON.stringify(object)); 

希望它会有所帮助。

这是一个非常具体的案例,我已经看到了这种行为。 在IE6和IE7中对我来说是可重现的。

在iframe中:

 window.parent.mySpecialHandler = function() { ...work... } 

然后,在用新内容重新加载iframe之后,在包含iframe的窗口中:

 window.mySpecialHandler(); 

由于mySpecialHandler是在不再退出的上下文(iframe的原始DOM)中定义的,因此此调用失败,并且“无法从释放的脚本执行代码”。 (重新加载iframe会破坏这个上下文。)

但是,您可以在父窗口中安全设置“可序列化”值(基元,不直接引用函数的对象图)。 如果你真的需要一个单独的窗口(在我的情况下,一个iframe)指定一些工作到一个远程窗口,你可以传递工作作为一个string和“评价”在接收器。 小心这一点,它通常不会使干净或安全的实现。

从IE9开始,我们开始接收这个错误时调用.getTime()存储在另一个对象的数组中的date对象。 解决方法是确保在调用date方法之前它是一个Date:

失败: rowTime = wl.rowData[a][12].getTime()

传递: rowTime = new Date(wl.rowData[a][12]).getTime()

当一个子窗口试图与不再打开的父窗口进行通信时,MSIE中可能会出现此错误。

(不完全是世界上最有帮助的错误信息文本。)

我碰到这个问题时,我在一个子框架中添加一个引用types到顶层窗口,并尝试访问子窗口后重新加载

 // set the value on first load window.top.timestamp = new Date(); // after frame reloads, try to access the value if(window.top.timestamp) // <--- Raises exception ... 

我能够通过仅使用基元types来解决问题

 // set the value on first load window.top.timestamp = Number(new Date()); 

这不是一个真正的答案,但更多的是一个恰恰发生的地方。

我们有框架A和框架B(这不是我的想法,但我必须忍受它)。 帧A永不改变,帧B不断变化。 我们不能将代码更改直接应用到框架A,因此(根据供应商的说明),我们只能在框架B中运行JavaScript – 确切的框架不断变化。

我们有一段JavaScript需要每隔5秒运行一次,所以框架B中的JavaScript创build一个新的脚本标签并插入到框架B的头部。setInterval存在于这个新的脚本中(注入的脚本),如以及调用的函数。 即使注入的JavaScript在技术上由框架A加载(因为它现在包含脚本标签),但一旦框架B发生更改,该function就不能再由setInterval访问。

我在一个页面最终打开一个iFrame的IE9中得到这个错误。 只要iFrame没有打开,我就可以使用localStorage。 一旦iFrame被打开和closures,我无法使用localStorage了,因为这个错误。 为了解决这个问题,我不得不将这段代码添加到iFrame中的Javascript中,并且使用localStorage。

 if (window.parent) { localStorage = window.parent.localStorage; } 

在打开对话框&父母ID或当前窗口标识未find时,在DHTMLX中出现此错误

  $(document).ready(function () { if (parent.dxWindowMngr == undefined) return; DhtmlxJS.GetCurrentWindow('wnManageConDlg').show(); }); 

只需确保在打开对话框的同时发送正确的curr /父窗口id

更新iframe的src我得到这个错误。

通过在主窗口中访问一个事件(点击我的情况)来获得这个错误(直接调用主窗口):

 top.$("#settings").on("click",function(){ $("#settings_modal").modal("show"); }); 

我只是这样改变它,它工作正常(调用iframe窗口的父级的父级):

 $('#settings', window.parent.parent.document).on("click",function(){ $("#settings_modal").modal("show"); }); 

包含模式的iframe也在另一个iframe中。