★★小白:不能执行已释放 Script 的代码

lanytin 2010-10-08 05:29:39
小弟页面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 的代码”这个错误。这个问题自己看了一个月,也没解决。
在网上查了很久,找到一篇,但是分析的也不清楚,对于我的问题,我也不太清楚如何调整代码。

恳请高手指点,也算是给以后遇到该问题的朋友一个答案。
...全文
1162 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
minioreo 2010-11-09
  • 打赏
  • 举报
回复
汗,我也遇到这个问题了,从modaldialog返回的数组一调用join之类的方法,就报这个错,害我自己用for来写。。。
  • 打赏
  • 举报
回复
原来是这么久的帖了。都讨论这么透了,我来收个尾,呵呵。
lanytin 2010-10-24
  • 打赏
  • 举报
回复
js数组对象的赋值,应该是创建一个指针,指向原来的内存地址。
而普通Object对象,应该是拷贝一份数据。

这只是小弟猜测的。不知道对不对。
lanytin 2010-10-24
  • 打赏
  • 举报
回复
呵呵,这个问题,上面各位说的,好像都没有解决问题。
我观察发现,‘不能执行已释放 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]);
}

这种方式。

我的问题就这样解决了。
Go 旅城通票 2010-10-12
  • 打赏
  • 举报
回复
function retValue(){
var checked = chktree.getChecked();
var checkedText = chktree.getCheckedText();
data.confirm({//=========变量是否调用错了?应该是checked和checkedText吧?
checked :checked /*key*/,
checkedText :checkedText /*val*/,
});
window.close();
}
Go 旅城通票 2010-10-12
  • 打赏
  • 举报
回复
 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();
}
地狱羔羊 2010-10-12
  • 打赏
  • 举报
回复
showModalDialog窗口给父窗口返回值不要用对象.都用字符串,数字就不会出现上述问题
地狱羔羊 2010-10-12
  • 打赏
  • 举报
回复
data.mm = this;改一下
把这个this这个对象在页面A中 复制一份,例如复制到 o
data.mm = o;
zhangshaolongjj 2010-10-12
  • 打赏
  • 举报
回复
我遇到过,就是父子页面之间调用的时候,另外的页面关闭了,但另一个还需要他的数据,这个时候ie就错了,处理方法,加个延时!
lanytin 2010-10-12
  • 打赏
  • 举报
回复
大家应该会遇见这个问题啊。中文网页找遍了,也没几篇讲这个的。
英文google也搜了,找到的倒是不少,但解决方法看的不懂。

高手们为什么不写篇博客,分析一下这个问题的原因和给出一些
解决办法呢?这是在是造福人类的举措啊

。。。继续等待
lanytin 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sandy945 的回复:]

data.mm = this;

这句是报错的原因

this 指向已被释放


key=data.mm.checked;

这个时候你在调用 data.mm.checked 就出现错误了
[/Quote]
原因是明白了,但是我的问题还是没有解决。郁闷中......
lanytin 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sandy945 的回复:]

定义一个全局变量 在 A 页 命名 current

-------------------------------------

data.mm = this;

=>
if(this){
current=this;
}
data.mm = current;
[/Quote]
试了一下,还是不行啊
阿非 2010-10-09
  • 打赏
  • 举报
回复
data.mm = this;

这句是报错的原因

this 指向已被释放


key=data.mm.checked;

这个时候你在调用 data.mm.checked 就出现错误了




zhangshaolongjj 2010-10-09
  • 打赏
  • 举报
回复
key=data.mm.checked;
你在这句的上面和下面alert试试,看看还报错吗?
lanytin 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sandy945 的回复:]

定义一个全局变量 在 A 页 命名 current

-------------------------------------

data.mm = this;

=>
if(this){
current=this;
}
data.mm = current;
[/Quote]
能不能说的清楚一点呢?
lanytin 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhangshaolongjj 的回复:]

function retValue(){ var checked = chktree.getChecked(); var checkedText = chktree.getCheckedText(); this.confirm({ checked : key, checkedText : val, }); window.setTimeout(function(){window.close();}……
[/Quote]
测试时,我自然是加上了。要不然就会报语法错误,而不是 如题的错误了。
阿非 2010-10-09
  • 打赏
  • 举报
回复
定义一个全局变量 在 A 页 命名 current

-------------------------------------

data.mm = this;

=>
if(this){
current=this;
}
data.mm = current;


zhangshaolongjj 2010-10-09
  • 打赏
  • 举报
回复
function retValue(){ var checked = chktree.getChecked(); var checkedText = chktree.getCheckedText(); this.confirm({ checked : key, checkedText : val, }); window.setTimeout(function(){window.close();}, 0);}
上面的少了个括号,cry。。。
lanytin 2010-10-09
  • 打赏
  • 举报
回复
大牛们,都跑什么地方了呢?
lanytin 2010-10-09
  • 打赏
  • 举报
回复
大家应该遇到过这个问题吧?为什么没有人分享一下解决的方法呢?
加载更多回复(4)

87,914

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧