我以为我不久前就找到了解决方案(请参阅我的 博客):

如果您遇到 JavaScript(或者应该是 JScript)错误“无法从释放的脚本执行代码” - 尝试移动头部中的任何元标记,以便它们位于脚本标记之前。

...但根据最新的博客评论之一,我建议的修复可能并不适合所有人。我认为这将是一个向 StackOverflow 社区开放的好机会......

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

有帮助吗?

解决方案

听起来您在处理某些标签的方式上遇到了错误/问题,或者您引用了您试图在其上执行方法的已发布对象。

首先我会移动任何 <meta> 任何标签之前 <script> 按照建议添加标签 这里 以及许多其他地方。

然后检查是否讨论了页面/安全问题 这里.

其他提示

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

如果您事先不知道窗口是否仍然存在,您可以执行 try/catch 来检测它:

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

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

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

总体思路如下:“主”窗口设置了一个函数来评估一些代码,是的,它就是那么难看。然后,“子”可以调用这个“构建器函数”(它/绑定到主窗口的范围/)并获取也绑定到“主”窗口的函数。当然,一个明显的缺点是,“反弹”的函数无法在它看似定义的范围内关闭......不管怎样,废话已经够多了:

这部分是伪代码,但我在 Windows 侧边栏小工具上使用了它的变体(我一直这样说是因为侧边栏小工具在“不受限制的区域 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 函数是在主窗口上下文中定义的!

我感觉我用了太多词了。YMMV。

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

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

希望它会有所帮助。

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

(这不完全是世界上最有用的错误消息文本。)

这是我见过这种行为的一个非常具体的案例。我可以在 IE6 和 IE7 中重现它。

从 iframe 内:

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

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

window.mySpecialHandler();

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

但是,您可以在父窗口中安全地设置“可序列化”值(基元、不直接引用函数的对象图)。如果您确实需要一个单独的窗口(在我的例子中是一个 iframe)来指定远程窗口的某些工作,您可以将工作作为字符串传递并在接收器中“评估”它。请小心这一点,它通常不会带来干净或安全的实现。

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

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

经过: rowTime = new Date(wl.rowData[a][12]).getTime()

当我在子框架内部添加引用类型到顶级窗口并尝试在子窗口重新加载后访问它时,我遇到了这个问题

IE。

// 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
...

我能够仅使用原始类型来解决该问题

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

这并不是一个真正的答案,而是一个具体发生情况的例子。

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

我们有一段 JavaScript 需要每 5 秒运行一次,因此框架 B 中的 JavaScript 创建一个新的脚本标记并插入到框架 B 的 head 部分。setInterval 存在于这个新脚本(注入的脚本)以及要调用的函数中。尽管从技术上讲,注入的 JavaScript 是由 A 帧加载的(因为它现在包含 script 标记),但一旦 B 帧发生更改,setInterval 就无法再访问该函数。

我在 IE9 中的一个最终打开 iFrame 的页面中遇到此错误。只要 iFrame 未打开,我就可以使用 localStorage。打开和关闭 iFrame 后,由于此错误,我无法再使用 localStorage。为了解决这个问题,我必须将此代码添加到 iFrame 内的 Javascript 中,并使用 localStorage。

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

打开对话时在 DHTMLX 中出现此错误 & 未找到父 id 或当前窗口 id

        $(document).ready(function () {

            if (parent.dxWindowMngr == undefined) return;
            DhtmlxJS.GetCurrentWindow('wnManageConDlg').show();

});

只需确保在打开对话框时发送正确的当前/父窗口 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 内。

前面的答案中的解释非常相关。只是想提供我的场景。希望这可以帮助其他人。

我们正在使用:

<script> window.document.writeln(table) </script>

, ,并调用脚本中的其他函数 onchange events 但 writeln 完全覆盖 IE 中的 HTML,因为它在 chrome 中具有不同的行为。

我们将其更改为:

<script> window.document.body.innerHTML = table;</script> 

因此保留了解决问题的脚本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top