解决IE9出现异常SCRIPT5011:不能执行已释放Script的代码
(2014-02-19 12:43:20)
标签:
ie9不能执行已释放scr潘深练itscript5011 |
分类: Javascript |
最近项目需要,做了一套JS插件,使用到模态窗口,在返回值得时候,出现一个异常
SCRIPT5011:不能执行已释放Script的代码
在IE6,IE7,IE8,chrome,firefox一些window主流的浏览器上,都可以正常运行,就是IE9上出现这个问题,其实,我们用模态方式打开个窗口,对于返回对象使用“==”与字符串比较时出现错误。原因是生成对象的窗口已经被销毁了,这个对象的valueOf与toString等方法调时会出现上述错误,一开始的情况是:
我使用 json 变量接收返回值 ,返回对象格式如 {id:1,name:senly,age:26}
var json = 模式窗口返回值 ( window.showModalDialog(url,...) )
返回之后我会做判断
if(IsEmpty(json )) return;
IsEmpty方法贴上
function IsEmpty(obj){
}
就是这个处理,报出了异常 SCRIPT5011:不能执行已释放Script的代码
因为脚本使用了==去做判断,所以在IE9下是不允许的,故此,我们可以这么处理:
try{
}catch(err){
}
注意:
虽然以上介绍了该异常出现的原由,以及对该异常进行的容错处理,但是,假如希望通过IE9,IE10,来实现模态窗口的数据回传,那又应该如何正确获取到数据呢?
首先,对于字符串型/布尔型的数据回调,ie9/10都是支持的,例如
window.returnValue = “我是模态窗口返回的数据”;
或者
window.returnValue = true;
最终在父窗口的通过
var json = 模式窗口返回值 ( window.showModalDialog(url,...) )
获取的json都是无误的,例如
但是,对于返回对象型的数据时,则会出现异常 不能执行已释放Script的代码
例如,返回对象格式如 {id:1,name:senly,age:26}
那么肯定不行,这时候我们可以这么来处理,在返回数据的时候,把对象数据拼接为字符串,然后在父窗口接收到之后,通过eval把字符串转化为对象,例如:
在模态窗口返回:
var dataStr = "{id:1,name:'senlypan'}";
window.parent.window.returnValue = dataStr ;
最终在父窗口解析:
var json = 模式窗口返回值 ( window.showModalDialog(url,...) )
// 模态窗口,处理取消/关闭 [undefined]
try{
}catch(err){
}
// 模态窗口,处理returnValue
var obj= eval_r('('+ json +')');
此时,就可以通过对象获取属性值了,例如通过obj.id或者obj.name,可以得到 1 或者 senlypan