功能概述:

最近做了一个教育科研系统,由于时间比较紧,所以能集成的功能都尽量做到了一起,其中一个上传附件的功能,在基类控制器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;


}


注意:



虽然以上介绍了该异常出现的原由,以及对该异常进行的容错处理,但是,假如希望通过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

解决IE11出现异常SCRIPT5011:不能执行已释放Script的代码的更多相关文章

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

    今天同事测试系统,突然出现一个异常SCRIPT5011:不能执行已释放Script的代码 应用场景:用模态方式打开个窗口,对于返回对象使用"=="与字符串比较时出现错误 我也用我的 ...

  2. ie11 SCRIPT5011:不能执行已释放Script的代码

    依照我遇到的问题为例: (我的页面结构为:父页面中嵌套有iframe子页面) 1.造成这种情况的原因是:父页面初始化声明变量a为数组(数组对象是引用类型,赋值传递的是地址),创建iframe子页面后给 ...

  3. SCRIPT5011:不能执行已释放Script的代码

    环境:win7 64位 IE9 错误:SCRIPT5011:不能执行已释放Script的代码. 现象:在父窗体的close()中调用嵌套的iframe页面的js方法返回一个对象时抛此异常. 原因:在一 ...

  4. WdatePicker 没有权限 不能执行已释放 Script 的代码

    提示 拒绝访问 或 没有权限 或 ' Window.document 或 '$dp' 为空或不是对象 $dp.dd is undefined 之类的错误 SCRIPT70: 没有权限 WdatePic ...

  5. ie中报错---不能执行已释放 Script 的代码

    我的原因:使用jquery.colorbox.js.在页面中使用弹框,对于父页面中的变量进行修改(弹框页面的js--window.parent.obj.arr= 数组;), 当弹框关闭之后,在父页面中 ...

  6. 不能执行已释放script的代码

    ”从Dom中删除IFrame后,IE9+会回收内存.影响范围:适用于 Internet Explorer 9 以及更高版本.“ 1. 应用场景(相当隐蔽!!!) 在主页面定义一个全局变量,然后让子页面 ...

  7. IE浏览器下错误,不能执行已释放script的代码

    错误提示: 错误原因: 我使用layui打开子页面,用到了父页面中的一个全局变量(我用的数组),子页面关闭后,使用该数组方法(如:arr.join(",")),便提示此错误 我的解 ...

  8. IE10弹窗showModalDialog关闭之后提示SCRIPT5011:不能执行已释放的Script代码

    在Web开发中,经常使用showModalDialog弹窗 今天遇到一个小问题,IE10中弹窗关闭之后提示SCRIPT5011:不能执行已释放的Script代码 网上搜罗了一些资料,发现大多都提到对象 ...

  9. 出现“不能执行已释放的Script代码”错误的原因及解决办法

    很多web开发者或许都遇到过这样的问题,程序莫名奇怪出现“不能执行已释放Script的代码”,错误行1,列1.对于这种消息描述不着边,行列描述更是让人迷茫的js错误,相信是所有调试js程序的朋友们最郁 ...

随机推荐

  1. Python 练习册--生成唯一激活码(邀请码)

    题目是这样子的: 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? 分析 其实要生成 ...

  2. JQuery源码分析(七)

    了解jQuery对DOM进行遍历背后的工作机制,这样可以在编写代码时有意识地避免一些不必要的重复操作,从而提升代码的性能. 关于jQuery对象的包装 var $aaron = $("aar ...

  3. UI基础:UITableView的编辑和移动

    相对UITableViiew进行编辑,必须设置代理,让代理遵循UITableViewDataSource和UITableViewDelegate协议.因为需要代理实现协议中几个必须的方法. UITab ...

  4. 手机端APP原型相关

    http://www.isux.us/demoo/index.php(很慢) https://www.mockplus.cn/

  5. 11、C#基础整理(特殊集合和哈希表)

    特殊集合:队列.栈 一.栈Stack类:先进后出,没有索引 Stack ss = new Stack(); 1.增加数据:push :将元素推入集合 ss.Push(); ss.Push(); ss. ...

  6. 锋利的jquery学习笔记

    1.$("#tt")获取的永远都是一个jquery对象,所以要判断页面上是否存在某个对象不能像js中 if($("#tt")){ } 而是通过: ){ } ps ...

  7. 简单的IOS6和IOS7通过图片名适配

    在美工提供图片图片的前提下,只需要下面给UIImage做一个分类,就可以简单的实现在6和7上的图片名字适配. 比如美工在6上面提供的图片叫common_button_big_red_highlight ...

  8. matlab的调试方法

    • 常用的调试方法.• (1) 设置或清除断点:使用快捷键F12. • (2) 执行:使用快捷键F5.• (3) 单步执行:使用快捷键F10. • (4) step in:当遇见函数时,进入函数内部, ...

  9. 【ajax】xhr

    jQuery xhr: function() { return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP&quo ...

  10. Qt之QCheckBox

    简述 QCheckBox继承自QAbstractButton,它提供了一个带文本标签的复选框. QCheckBox(复选框)和QRadioButton(单选框)都是选项按钮.这是因为它们都可以在开(选 ...