小弟页面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 的代码”这个错误。这个问题自己看了一个月,也没解决。
在网上查了很久,找到一篇,但是分析的也不清楚,对于我的问题,我也不太清楚如何调整代码。恳请高手指点,也算是给以后遇到该问题的朋友一个答案。
功能大概是这样:第一次选择树中的节点,关闭窗口,把选中的值传到页面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 的代码”这个错误。这个问题自己看了一个月,也没解决。
在网上查了很久,找到一篇,但是分析的也不清楚,对于我的问题,我也不太清楚如何调整代码。恳请高手指点,也算是给以后遇到该问题的朋友一个答案。
上面的少了个括号,cry
if(this){
current=this;
}
data.mm = current;
你在这句的上面和下面alert试试,看看还报错吗?
key=data.mm.checked;这个时候你在调用 data.mm.checked 就出现错误了
英文google也搜了,找到的倒是不少,但解决方法看的不懂。高手们为什么不写篇博客,分析一下这个问题的原因和给出一些
解决办法呢?这是在是造福人类的举措啊继续等待
把这个this这个对象在页面A中 复制一份,例如复制到 o
data.mm = o;
/*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();
}
var checked = chktree.getChecked();
var checkedText = chktree.getCheckedText();
data.confirm({//=========变量是否调用错了?应该是checked和checkedText吧?
checked :checked /*key*/,
checkedText :checkedText /*val*/,
});
window.close();
}
我观察发现,‘不能执行已释放 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]);
}
这种方式。我的问题就这样解决了。
而普通Object对象,应该是拷贝一份数据。这只是小弟猜测的。不知道对不对。