小弟页面A中点击按钮,弹出窗口B(window.showModalDialog),B中有棵多选树。
功能大概是这样:第一次选择树中的节点,关闭窗口,把选中的值传到页面A;第二次点击按钮时,第一次树中选中的节点,这次默认选中。checked 是树选中节点的id,checkedText 是树选中节点的文字。页面A的部分js,注意通过data.mm把页面A的obj传到页面B:obj={
   config : undefined,
   url : undefined,
   retval : undefined,
   checked : [],
   checkedText : [],
   ......
   processData:function(){
var data={};
data.divid=this.config.divid||'01';
data.type=this.config.type||'radio';
data.url =this.url;
data.mm = this;
var retval = window.showModalDialog(app.path+"/B.jsp", data, "center=yes;scrollbars=no;resizable=no;help=no;status=no;dialogTop=200; dialogLeft=300;dialogHeight=400px;dialogwidth=580px;");
},
   confirm:function(retval){
this.retval = retval;
this.checkedText =retval.checkedText;
this.checked = retval.checked
......
    },
};在页面B的js中,可以data=window.dialogArguments;
可以拿到页面A传过来的data。拿到data后,进行一些操作。
页面B的部分js如下:var key=[],val=[];
function someOpers(){
    data= window.dialogArguments;
    
    key=data.mm.checked;
    val=data.mm.chekcedText; 
    ......
    //对数组进行一些 push、remove的操作
    ......
}
function retValue(){
var checked = chktree.getChecked();
var checkedText = chktree.getCheckedText();
this.confirm({
checked : key,
checkedText : val,
});
window.close();
}最后关闭弹出窗口时,执行retValue()方法,注意的是:执行该方法时,我指定它的域(scope)是data.mm,也就是页面A的ojb,这时通过this.confirm()就可以执行页面A的obj.confirm()方法了。整个代码已经完成了,在firefox中,也没有问题。
但是在ie6\ie8中,当第二次弹出窗口时,通过 key=data.mm.checked;然后对key进行一些操作时,
报出了“不能执行已释放 Script 的代码”这个错误。这个问题自己看了一个月,也没解决。
在网上查了很久,找到一篇,但是分析的也不清楚,对于我的问题,我也不太清楚如何调整代码。恳请高手指点,也算是给以后遇到该问题的朋友一个答案。

解决方案 »

  1.   

    function retValue(){ var checked = chktree.getChecked(); var checkedText = chktree.getCheckedText(); this.confirm({ checked : key, checkedText : val, }); window.setTimeout(function(){window.close();}, 0 }
      

  2.   

    function retValue(){ var checked = chktree.getChecked(); var checkedText = chktree.getCheckedText(); this.confirm({ checked : key, checkedText : val, }); window.setTimeout(function(){window.close();}, 0);}
    上面的少了个括号,cry
      

  3.   

    定义一个全局变量 在 A 页 命名 current------------------------------------- data.mm = this;=>
    if(this){
        current=this;
    }
     data.mm = current;
      

  4.   

    key=data.mm.checked;
    你在这句的上面和下面alert试试,看看还报错吗?
      

  5.   

    data.mm = this;这句是报错的原因this 指向已被释放
    key=data.mm.checked;这个时候你在调用  data.mm.checked 就出现错误了
      

  6.   

    大家应该会遇见这个问题啊。中文网页找遍了,也没几篇讲这个的。
    英文google也搜了,找到的倒是不少,但解决方法看的不懂。高手们为什么不写篇博客,分析一下这个问题的原因和给出一些
    解决办法呢?这是在是造福人类的举措啊继续等待
      

  7.   

    data.mm = this;改一下
    把这个this这个对象在页面A中 复制一份,例如复制到 o
    data.mm = o;
      

  8.   

    showModalDialog窗口给父窗口返回值不要用对象.都用字符串,数字就不会出现上述问题
      

  9.   

     processData:function(){
            /*var data={};
            data.divid=this.config.divid||'01';
            data.type=this.config.type||'radio';
            data.url =this.url;
            data.mm = this;*/
    //===========直接传递this就行,此时this==obj,何必多申明一个变量,而且divid和type都是obj的config中的属性,有点浪费了吧。。
            var retval = window.showModalDialog(app.path+"/B.jsp", this, "center=yes;scrollbars=no;resizable=no;help=no;status=no;dialogTop=200; dialogLeft=300;dialogHeight=400px;dialogwidth=580px;");
        }
    var key=[],val=[];
    function someOpers(){
        data= window.dialogArguments;
        
        key=data.checked;/////////
        val=data.chekcedText;   ////////  
        ......
        //对数组进行一些 push、remove的操作
        ......
    }
    function retValue(){
            var checked = chktree.getChecked();
            var checkedText = chktree.getCheckedText();
            data.confirm({//=========
                    checked : key,
                    checkedText : val,
            });
            window.close();
        }
      

  10.   

    function retValue(){
            var checked = chktree.getChecked();
            var checkedText = chktree.getCheckedText();
            data.confirm({//=========变量是否调用错了?应该是checked和checkedText吧?
                    checked :checked /*key*/,
                    checkedText :checkedText /*val*/,
            });
            window.close();
        }
      

  11.   

    呵呵,这个问题,上面各位说的,好像都没有解决问题。
    我观察发现,‘不能执行已释放 Script 的代码’报错都是在数组的赋值上。
    通过测试,我试了两种办法。第一种就是不把this,而是创建一个对象,传到弹出页面B中。关闭页面B时,window.returnValue=objB
    window.close();另外一种是,在页面B中赋值时,对象的赋值,可以直接var obj_new=data.mm.objA;
    但是数组的赋值,不应使用
    var arr_new=data.mm.checked;这种方法,而是通过复制到方式:
    arr_new=data.mm.checked.slice(0);
    或者
    for(var i=0;i<data.mm.checked.length;i++){
    arr.push(data.mm.checked[i]);
    }
    这种方式。我的问题就这样解决了。
      

  12.   

    js数组对象的赋值,应该是创建一个指针,指向原来的内存地址。
    而普通Object对象,应该是拷贝一份数据。这只是小弟猜测的。不知道对不对。
      

  13.   

    汗,我也遇到这个问题了,从modaldialog返回的数组一调用join之类的方法,就报这个错,害我自己用for来写