什么导致错误“无法从释放的脚本执行代码”
我以为我刚才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中。