解决IE11出现异常SCRIPT5011:不能执行已释放Script的代码
2015-12-10 09:54
597 查看
功能概述:
最近做了一个教育科研系统,由于时间比较紧,所以能集成的功能都尽量做到了一起,其中一个上传附件的功能,在基类控制器BaseController 中建了一个Action返回视图,其他需要上传附件的地方都统一调用该视图弹出模态窗口window.showModalDialog,返回上传文件的路径和数据库表存的该附件路径的guid,在调用页面将返回附件的guid保存到数据表中:
遇到的问题:
该功能在火狐浏览器中完全正常,但是在IE11浏览器(其他版本未测试)中出现:不能执行已释放Script的代码 的异常。但是实际上值已经取到,但是直接判断是否为null等时报异常:
解决方案:
将弹出窗口返回的数组对象改为字符串,回到调用页面时再解析成对象(对象是引用类型:的赋值传递的是地址,字符串是值类型:赋值是传递的值)。
调用页面js代码:
其中视图页面代码:
引用:http://blog.sina.com.cn/s/blog_6ac4c6cb0101is29.html
在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;
}
[b]注意:[/b]
[b]
虽然以上介绍了该异常出现的原由,以及对该异常进行的容错处理,但是,假如希望通过IE9,IE10,来实现模态窗口的数据回传,那又应该如何正确获取到数据呢?[/b]
[b]
首先,对于字符串型/布尔型的数据回调,ie9/10都是支持的,例如[/b]
[b]
window.returnValue =
“我是模态窗口返回的数据”;[/b]
[b]
或者[/b]
[b]
[b]
window.returnValue =
true;[/b][/b]
[b]
最终在父窗口的通过[/b]
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
最近做了一个教育科研系统,由于时间比较紧,所以能集成的功能都尽量做到了一起,其中一个上传附件的功能,在基类控制器BaseController 中建了一个Action返回视图,其他需要上传附件的地方都统一调用该视图弹出模态窗口window.showModalDialog,返回上传文件的路径和数据库表存的该附件路径的guid,在调用页面将返回附件的guid保存到数据表中:
遇到的问题:
该功能在火狐浏览器中完全正常,但是在IE11浏览器(其他版本未测试)中出现:不能执行已释放Script的代码 的异常。但是实际上值已经取到,但是直接判断是否为null等时报异常:
解决方案:
将弹出窗口返回的数组对象改为字符串,回到调用页面时再解析成对象(对象是引用类型:的赋值传递的是地址,字符串是值类型:赋值是传递的值)。
调用页面js代码:
/* * 上传 * typeFlag:1-文件,2-图片,3-三维动画 */ function MyUpload(dom, guid, typeFlag) { var obj = new Object(); var strResult = window.showModalDialog('/Base/ShowUploadView?typeFlag=' + typeFlag, obj, "dialogWidth=600px;dialogHeight=300px;"); if (strResult != null && strResult != undefined && strResult != "" && strResult.length > 0) { var ArrResult = eval(strResult); if (ArrResult[0].guid != null && ArrResult[0].guid != undefined && ArrResult[0].guid != "") { $.ajax({ url: '/InstrumentShare/UpdateContractAttachmentData', type: 'post', dataType: 'text', data: { 'headID': guid, 'filesID': ArrResult[0].guid }, success: function (result) { if (result === ""||result===null) { if (dom.nextElementSibling.nodeName === "A") { //判断是否是a标签 dom.nextElementSibling.href = ArrResult[0].filesPath; dom.nextElementSibling.style.display = ""; //显示下载a标签,没有附件时是隐藏状态 } alert("保存附件成功!"); } else { alert("保存附件失败:" + result); } }, error: function (result) { alert("程序异常:保存附件失败!"); } }); } } }
其中视图页面代码:
@{ ViewBag.Title = "上传附件"; Layout = "~/Views/Shared/_Layout-nofooter.cshtml"; } <script src="~/Scripts/UploadsFile/jquery.uploadify-3.1.min.js" type="text/javascript"></script> <link href="~/Scripts/UploadsFile/uploadify.css" rel="stylesheet" /> <div class="modal-header" style="height:50px;"> <h4 id="myModalLabel">上传附件</h4> </div> <div class="modal-body"> <table class="basicTable"> <tr> <td class="edu_width100">上传附件:</td> <td id="attachmentName"></td> </tr> <tr> <td> <input type="file" id="file_upload" name="file_upload" /> <span></span> </td> <td></td> </tr> </table> @*<div class="row"> <div class="col-lg-4">上传附件:</div> <div class="col-lg-6"> <span id="attachmentName"></span> </div> <div class="col-lg-2"></div> </div> <div class="row"> <div> <input type="file" id="file_upload" name="file_upload" /> <span></span> </div> </div>*@ </div> <div class="modal-footer"> <button class="scbtn addBtn" aria-hidden="true" onclick="GetRetuValue()"> 保存 </button> <button class="scbtn btn-warning" aria-hidden="true" onclick="CancelSelect()"> 取消 </button> </div> <script type="text/javascript"> // 窗口返回值 var strResult; var typeFlag = '@ViewBag.typeFlag';//文件类别:1-文档文件,2-图片文件,3-三维动画 var filesType = '*.*';//上传文件类型 /* * 附件上传 */ $(function () { //文件 if (typeFlag === '1') { filesType = '*.doc;*.txt;*.ppt;*.xls;*.docx;*.xlsx;*.rar;*.zip'; } //图片 else if (typeFlag === '2') { filesType = '*.jpg;*.jpeg;*.png'; } //三维动画 else if (typeFlag === '3') { filesType = '*.swf;*.flv;*.gif'; } else { alert("文件类型初始化错误!"); window.close(); } }) function uploadfile() { $('#file_upload').uploadify('upload', '*'); } function Clearupload() { $('#file_upload').uploadify('cancel', '*'); } /* * 图片附件上传 */ $(function () { var strPath = ''; $('#file_upload').uploadify({ 'swf': '@Url.Content("~/Scripts/UploadsFile/uploadify.swf")', 'buttonText': '添加附件', 'auto': true, multi: true, //'uploadLimit': 1, //'queueSizeLimit': 1, 'fileTypeExts': filesType, 'formData': { 'typeFlag': '@ViewBag.typeFlag' },//此处修改附件类型 'uploader': '/Base/uploadsAttachment', 'fileSizeLimit': '100MB', 'onSelectError': function (file, errorCode, errorMsg) { switch (errorCode) { case -100: alert("上传的文件数量已经超出系统限制的" + $('#file_upload').uploadify('settings', 'queueSizeLimit') + "个文件!"); break; case -110: alert("文件 [" + file.name + "] 大小超出系统限制的" + $('#file_upload').uploadify('settings', 'fileSizeLimit') + "大小!"); break; case -120: alert("文件 [" + file.name + "] 大小异常!"); break; } }, 'onUploadComplete': function (file) { Clearupload(); }, 'onQueueComplete': function (data) { Clearupload(); //$("#Attachment").val($("#Attachment").val() + ";" + strPath); }, 'onUploadSuccess': function (file, data, response) { var result = eval('(' + data + ')'); if (result.Success) { if (result.guid != undefined && result.guid != 'undefined') { //获取返回数据 aResult = new Array(); //eval({ guid: "ae3c9336-1101-49fd-8116-755cef6bbd27", filesPath: " '/Base/MyDownLoad?Filepath='/UpLoadFile/images/b648fdd0-19d5-4e78-8435-db2ff8d2d147.jpg" }) //aResult={'guid: "'+ result.guid+'", filesPath: "/Base/MyDownLoad?Filepath='+result.filesPath+ '"'}; aResult.push({ guid: result.guid, filesPath: '/Base/MyDownLoad?Filepath=' + result.filesPath }); strResult = JSON.stringify(aResult); $("#attachmentName").text(result.FileName); alert("添加附件成功!"); } } else { alert(result.Message); return false; } return true; }, onUploadError: function (file, errorCode, erorMsg, errorString) { } }); }); /* * 删除附件 */ function DeleteAttachment(attachmentID, fileName, typeFlag) { if (confirm("您确定要删除附件 【 " + fileName + "】 吗?")) { $.ajax({ url: '/Base/DeleteAttachment', type: 'post', datatype: 'text', data: { attachmentID: attachmentID, attachmentID: attachmentID, fileName: fileName, typeFlag: typeFlag }, success: function (rel) { var data = eval(rel); if (data.Success) { //移除元素,隐藏控件赋值 //$('#span_' + attachmentID).remove(); } alert(data.Message); } }); } } /* * 获取选中值关闭dialog窗口并返回选中值(置于弹出窗口页面中):待修改 */ function GetRetuValue(result) { //弹出框返回值 window.returnValue = strResult; window.close(); } /* * 获取选中值关闭dialog窗口并返回选中值(置于弹出窗口页面中):待修改 */ function CancelSelect() { //弹出框返回值 window.returnValue = ""; window.close(); } </script> <!-- ModalEnd -->
引用:http://blog.sina.com.cn/s/blog_6ac4c6cb0101is29.html
在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;
}
[b]注意:[/b]
[b]
虽然以上介绍了该异常出现的原由,以及对该异常进行的容错处理,但是,假如希望通过IE9,IE10,来实现模态窗口的数据回传,那又应该如何正确获取到数据呢?[/b]
[b]
首先,对于字符串型/布尔型的数据回调,ie9/10都是支持的,例如[/b]
[b]
window.returnValue =
“我是模态窗口返回的数据”;[/b]
[b]
或者[/b]
[b]
[b]
window.returnValue =
true;[/b][/b]
[b]
最终在父窗口的通过[/b]
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
相关文章推荐
- java web项目中的拦截未登录用户的问题
- 支付接口示例代码
- php数组函数-array_change_key_case()
- java代码分析及分析工具
- C++11并行编程-条件变量(condition_variable)详细说明
- 【Java并发编程实战】-----“J.U.C”:CLH队列锁
- java中包命名常见规则
- myeclipse 使用 color theme javascirpt背景发白
- C#开源的AOP框架--KingAOP基础
- java客户端调用Servlet
- Java中equals和==的区别
- 优雅的使用 PhpStorm 来开发 Laravel 项目(翻译中)
- 【Java并发编程实战】-----“J.U.C”:CLH队列锁
- org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document fro
- 版本控制工具SourceTree使用------冲突解决
- DedeCMS安全:FTP设置dedecms目录权限
- Java设计模式——工厂模式
- 欢迎使用CSDN-markdown编辑器
- Java设计模式——工厂模式
- go 多值返回