zoukankan      html  css  js  c++  java
  • 解决IE11出现异常SCRIPT5011:不能执行已释放Script的代码

    功能概述:

    最近做了一个教育科研系统,由于时间比较紧,所以能集成的功能都尽量做到了一起,其中一个上传附件的功能,在基类控制器BaseController 中建了一个Action返回视图,其他需要上传附件的地方都统一调用该视图弹出模态窗口window.showModalDialog,返回上传文件的路径和数据库表存的该附件路径的guid,在调用页面将返回附件的guid保存到数据表中:

    遇到的问题:

    该功能在火狐浏览器中完全正常,但是在IE11浏览器(其他版本未测试)中出现:不能执行已释放Script的代码 的异常。但是实际上值已经取到,但是直接判断是否为null等时报异常:

    解决方案:

    将弹出窗口返回的数组对象改为字符串,回到调用页面时再解析成对象(对象是引用类型:的赋值传递的是地址,字符串是值类型:赋值是传递的值)。

    调用页面js代码:

     1  /*
     2    * 上传 
     3    * typeFlag:1-文件,2-图片,3-三维动画
     4    */
     5     function MyUpload(dom, guid, typeFlag) {
     6         var obj = new Object();
     7         var strResult = window.showModalDialog('/Base/ShowUploadView?typeFlag=' + typeFlag, obj, "dialogWidth=600px;dialogHeight=300px;");
     8         if (strResult != null && strResult != undefined && strResult != "" && strResult.length > 0) {
     9             var ArrResult = eval(strResult);
    10             if (ArrResult[0].guid != null && ArrResult[0].guid != undefined && ArrResult[0].guid != "") {
    11                 $.ajax({
    12                     url: '/InstrumentShare/UpdateContractAttachmentData',
    13                     type: 'post',
    14                     dataType: 'text',
    15                     data: { 'headID': guid, 'filesID': ArrResult[0].guid },
    16                     success: function (result) {
    17                         if (result === ""||result===null) {
    18                             if (dom.nextElementSibling.nodeName === "A") {  //判断是否是a标签
    19                                 dom.nextElementSibling.href = ArrResult[0].filesPath;
    20                                 dom.nextElementSibling.style.display = ""; //显示下载a标签,没有附件时是隐藏状态
    21                             }
    22                             alert("保存附件成功!");
    23                         }
    24                         else {
    25                             alert("保存附件失败:" + result);
    26                         }
    27                     },
    28                     error: function (result) {
    29                         alert("程序异常:保存附件失败!");
    30                     }
    31                 });
    32             }
    33 
    34         }
    35     }

    其中视图页面代码:

      1 @{
      2     ViewBag.Title = "上传附件";
      3     Layout = "~/Views/Shared/_Layout-nofooter.cshtml";
      4 }
      5 
      6 <script src="~/Scripts/UploadsFile/jquery.uploadify-3.1.min.js" type="text/javascript"></script>
      7 <link href="~/Scripts/UploadsFile/uploadify.css" rel="stylesheet" />
      8 
      9 
     10 <div class="modal-header" style="height:50px;">
     11     <h4 id="myModalLabel">上传附件</h4>
     12 </div>
     13 <div class="modal-body">
     14     <table class="basicTable">
     15         <tr>
     16             <td class="edu_width100">上传附件:</td>
     17             <td id="attachmentName"></td>
     18         </tr>
     19         <tr>
     20             <td>
     21                 <input type="file" id="file_upload" name="file_upload" />
     22                 <span></span>
     23             </td>
     24             <td></td>
     25         </tr>
     26     </table>
     27     @*<div class="row">
     28         <div class="col-lg-4">上传附件:</div>
     29         <div class="col-lg-6">
     30            <span id="attachmentName"></span>
     31         </div>
     32         <div class="col-lg-2"></div>
     33     </div>
     34     <div class="row">
     35         <div>
     36             <input type="file" id="file_upload" name="file_upload" />
     37             <span></span>
     38         </div>
     39     </div>*@
     40 </div>
     41 <div class="modal-footer">
     42     <button class="scbtn addBtn" aria-hidden="true" onclick="GetRetuValue()">
     43         保存
     44     </button>
     45     <button class="scbtn btn-warning" aria-hidden="true" onclick="CancelSelect()">
     46         取消
     47     </button>
     48 </div>
     49 
     50 
     51 <script type="text/javascript">
     52     // 窗口返回值
     53     var strResult;
     54     var typeFlag = '@ViewBag.typeFlag';//文件类别:1-文档文件,2-图片文件,3-三维动画
     55     var filesType = '*.*';//上传文件类型
     56 
     57     /*
     58     * 附件上传
     59     */
     60     $(function () {
     61         //文件
     62         if (typeFlag === '1') {
     63             filesType = '*.doc;*.txt;*.ppt;*.xls;*.docx;*.xlsx;*.rar;*.zip';
     64         }
     65         //图片
     66         else if (typeFlag === '2') {
     67             filesType = '*.jpg;*.jpeg;*.png';
     68         }
     69         //三维动画
     70         else if (typeFlag === '3') {
     71             filesType = '*.swf;*.flv;*.gif';
     72         }
     73         else {
     74             alert("文件类型初始化错误!");
     75             window.close();
     76         }
     77     })
     78     function uploadfile() {
     79         $('#file_upload').uploadify('upload', '*');
     80     }
     81 
     82     function Clearupload() {
     83         $('#file_upload').uploadify('cancel', '*');
     84     }
     85 
     86     /*
     87     * 图片附件上传
     88     */
     89     $(function () {
     90         var strPath = '';
     91         $('#file_upload').uploadify({
     92             'swf': '@Url.Content("~/Scripts/UploadsFile/uploadify.swf")',
     93             'buttonText': '添加附件',
     94             'auto': true,
     95             multi: true,
     96             //'uploadLimit': 1,
     97             //'queueSizeLimit': 1,
     98             'fileTypeExts': filesType,
     99             'formData': { 'typeFlag': '@ViewBag.typeFlag' },//此处修改附件类型
    100             'uploader': '/Base/uploadsAttachment',
    101             'fileSizeLimit': '100MB',
    102             'onSelectError': function (file, errorCode, errorMsg) {
    103                 switch (errorCode) {
    104                     case -100:
    105                         alert("上传的文件数量已经超出系统限制的" + $('#file_upload').uploadify('settings', 'queueSizeLimit') + "个文件!");
    106                         break;
    107                     case -110:
    108                         alert("文件 [" + file.name + "] 大小超出系统限制的" + $('#file_upload').uploadify('settings', 'fileSizeLimit') + "大小!");
    109                         break;
    110                     case -120:
    111                         alert("文件 [" + file.name + "] 大小异常!");
    112                         break;
    113                 }
    114             },
    115             'onUploadComplete': function (file) {
    116                 Clearupload();
    117             },
    118             'onQueueComplete': function (data) {
    119                 Clearupload();
    120                 //$("#Attachment").val($("#Attachment").val() + ";" + strPath);
    121             },
    122             'onUploadSuccess': function (file, data, response) {
    123                 var result = eval('(' + data + ')');
    124                 if (result.Success) {
    125                     if (result.guid != undefined && result.guid != 'undefined') {
    126                         //获取返回数据
    127                         aResult = new Array();
    128                         //eval({ guid: "ae3c9336-1101-49fd-8116-755cef6bbd27", filesPath: " '/Base/MyDownLoad?Filepath='/UpLoadFile/images/b648fdd0-19d5-4e78-8435-db2ff8d2d147.jpg" })
    129                         //aResult={'guid: "'+ result.guid+'", filesPath: "/Base/MyDownLoad?Filepath='+result.filesPath+ '"'};
    130 
    131                         aResult.push({ guid: result.guid, filesPath: '/Base/MyDownLoad?Filepath=' + result.filesPath });
    132                         strResult = JSON.stringify(aResult);
    133                         $("#attachmentName").text(result.FileName);
    134                         alert("添加附件成功!");
    135                     }
    136                 } else {
    137                     alert(result.Message);
    138                     return false;
    139                 }
    140                 return true;
    141             },
    142             onUploadError: function (file, errorCode, erorMsg, errorString) {
    143             }
    144         });
    145     });
    146 
    147     /*
    148     * 删除附件
    149     */
    150     function DeleteAttachment(attachmentID, fileName, typeFlag) {
    151         if (confirm("您确定要删除附件 【 " + fileName + "】 吗?")) {
    152             $.ajax({
    153                 url: '/Base/DeleteAttachment',
    154                 type: 'post',
    155                 datatype: 'text',
    156                 data: { attachmentID: attachmentID, attachmentID: attachmentID, fileName: fileName, typeFlag: typeFlag },
    157                 success: function (rel) {
    158                     var data = eval(rel);
    159                     if (data.Success) {
    160                         //移除元素,隐藏控件赋值
    161                         //$('#span_' + attachmentID).remove();
    162                     }
    163                     alert(data.Message);
    164                 }
    165             });
    166         }
    167     }
    168 
    169     /*
    170 * 获取选中值关闭dialog窗口并返回选中值(置于弹出窗口页面中):待修改
    171 */
    172     function GetRetuValue(result) {
    173         //弹出框返回值
    174         window.returnValue = strResult;
    175         window.close();
    176     }
    177 
    178     /*
    179    * 获取选中值关闭dialog窗口并返回选中值(置于弹出窗口页面中):待修改
    180    */
    181     function CancelSelect() {
    182         //弹出框返回值
    183         window.returnValue = "";
    184         window.close();
    185     }
    186 </script>
    187 <!-- 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

  • 相关阅读:
    mysql中删除表
    js上传文件获取客户端地址
    form表单普通提交预览显示,读取显示tmp文件
    PHP中获取中英文混合字符串长度[主要是指个数,而不是字符串长度](转)
    离开页面提醒功能 (实现博客园离开编辑页面时的提醒功能)(转)
    Google maps API开发(一)(转)
    Python的getattr(),setattr(),delattr(),hasattr()
    Python读写文件
    Python命令行解析argparse常用语法使用简介
    面向对象设计与分析实例
  • 原文地址:https://www.cnblogs.com/xiaoerlang90/p/5035046.html
Copyright © 2011-2022 走看看