加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

解决IE9出现异常SCRIPT5011:不能执行已释放Script的代码

(2014-02-19 12:43:20)
标签:

ie9不能执行已释放scr

潘深练

it

script5011

分类: 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){
     if(typeof(obj)=="undefined"||obj==null||(typeof(obj)!="object"&&(obj+"").replace(/ /g,"")==""|| obj=="null" || obj.length==0)){
          return true;
     }
     return false;
}

 

就是这个处理,报出了异常 SCRIPT5011:不能执行已释放Script的代码

因为脚本使用了==去做判断,所以在IE9下是不允许的,故此,我们可以这么处理:

try{

    if(IsEmpty(json.id))

    return;

}catch(err){

    return;

}

 

注意:

 

虽然以上介绍了该异常出现的原由,以及对该异常进行的容错处理,但是,假如希望通过IE9,IE10,来实现模态窗口的数据回传,那又应该如何正确获取到数据呢?

 

首先,对于字符串型/布尔型的数据回调,ie9/10都是支持的,例如

 

window.returnValue = “我是模态窗口返回的数据”;

 

或者

 

window.returnValue = true;

 

最终在父窗口的通过

 

var json = 模式窗口返回值 ( window.showModalDialog(url,...) )

 

获取的json都是无误的,例如

 

 “我是模态窗口返回的数据”或是 true

 

但是,对于返回对象型的数据时,则会出现异常 不能执行已释放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{

    if(IsEmpty(json))return;

}catch(err){

    return;

}

// 模态窗口,处理returnValue  [对象销毁],对象不兼容,使用str转换为对象:
var obj= eval_r('('+ json +')');

 

此时,就可以通过对象获取属性值了,例如通过obj.id或者obj.name,可以得到 1 或者 senlypan

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有