Javascript 错误的原因是什么;Can';t从释放的脚本执行代码";

Javascript 错误的原因是什么;Can';t从释放的脚本执行代码";,javascript,internet-explorer,Javascript,Internet Explorer,我想我已经找到了解决方案(见我的): 如果您遇到JavaScript(或者应该是JScript)错误“无法从释放的脚本执行代码”-请尝试移动头部的任何元标记,使它们位于脚本标记之前 …但根据最近的一条博客评论,我建议的修复可能并不适用于所有人。我认为这将是一个向StackOverflow社区开放的好机会 “无法从释放的脚本执行代码”错误的原因是什么?解决方案/解决方法是什么?当子窗口尝试与不再打开的父窗口通信时,MSIE中可能会发生此错误 (这并不是世界上最有用的错误消息文本。)调用在已不存在的

我想我已经找到了解决方案(见我的):

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

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


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

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


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

调用在已不存在的窗口或框架中创建的函数时,会出现此错误

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

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

当脚本的“父”窗口被释放(即:关闭)但对仍保留的脚本的引用(如在另一个窗口中)被调用时,会导致此错误。即使“对象”仍处于活动状态,但它要在其中执行的上下文也不存在

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

以下是总体思路: “主”窗口设置了一个函数,该函数将评估一些代码,是的,就是这么难看。 然后一个“子”可以调用这个“构建器函数”(它是/绑定到主窗口的作用域/),并返回一个也绑定到“主”窗口的函数。当然,一个明显的缺点是,“反弹”函数不能在它似乎定义的范围内关闭。。。总之,别再胡扯了:

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

作为一种变体,主窗口应该能够将functionBuilder函数传递给子窗口——只要functionBuilder函数是在主窗口上下文中定义的


我觉得我用了太多的词。YMMV.

这里有一个非常具体的案例,我看到了这种行为。在IE6和IE7中对我来说是可复制的

从iframe中:

window.parent.mySpecialHandler = function() { ...work... }
然后,在使用新内容重新加载iframe后,在包含iframe的窗口中:

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


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

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

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


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

这并不是一个真正的答案,但更多的是一个确切发生这种情况的例子

我们有A帧和B帧(这不是我的主意,但我不得不接受它)。帧A从不改变,帧B不断改变。我们无法将代码更改直接应用到框架A中,因此(根据供应商的指示),我们只能在框架B中运行JavaScript—这正是不断更改的框架


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

我在IE9中的一个页面中发现了这个错误,该页面最终打开了一个iFrame。只要iFrame没有打开,我就可以使用localStorage。一旦iFrame被打开和关闭,由于这个错误,我就不能再使用localStorage了。为了修复它,我必须将此代码添加到iFrame中的Javascript中,并使用localStorage

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

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

i、 e


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

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

希望能有所帮助。

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

        $(document).ready(function () {

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

});

只要确保在更新iframe的src时打开对话框时发送正确的curr/parent窗口id,我就收到了错误

通过访问主窗口中某个元素的事件(在我的示例中为单击)获得该错误,如下所示(直接调用主/最外面的窗口):

我只是这样更改了它,它工作得很好(调用iframe窗口的父窗口的父窗口):


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

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

我们使用的是:

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

因此,保留了修复问题的脚本。

反之亦然(父对子)当子窗口调用父窗口上的函数并传递参数,然后关闭自身时,我得到了这个结果。看起来这个参数(一个对象)是被创建的
var objectCopy = JSON.parse(JSON.stringify(object));
        $(document).ready(function () {

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

});
top.$("#settings").on("click",function(){
    $("#settings_modal").modal("show");
}); 
$('#settings', window.parent.parent.document).on("click",function(){                    
   $("#settings_modal").modal("show");      
});
<script> window.document.writeln(table) </script>
<script> window.document.body.innerHTML = table;</script>