您的位置:首页 > 编程语言

【不能执行已释放的 sript 代码】 已解决 命名【疾风】

2016-08-01 16:02 141 查看
        在上周开发中遇上个恶心的问题,IE报错:“不能执行已释放的 script 代码”。当时已进入测试阶段,测试人员5点30提出的bug,自己一直搞到7:30才解决,这是没有任何补偿的加班。

背景概述:一个功能,两个主页面,这两个页面是单独的。这个功能的开发主要是本人负责,但是第二个主页面不是我写的,问题也就出在了第二个主页面上(以下以二主简称)。该页面上的操作逻辑是这样,选择人员(datagrid),选择项目-弹出窗口(datagrid)选择完成数据传递到该页面(二主),然后选择角色,点击保存(分配/替换),弹出确认页面,确认页面上有一些数据确认数据,点确认会从确认页面用ajax向后台传值。这时,Duang~前台报错了(在测试那里就是没反应了)。

这还是第一次遇到这个问题,之前自测时并没遇到,经对比测试数据发现使用历史数据可,新发起的项目就会报错,原因在于将项目信息转为json时调用了jquery的日期类型转换的函数,这时就会报错。历史数据不报错是因为历史数据没有存储日期相关的数据,因此也不存在转换调用函数的问题。

经过分析了解了是项目数据的问题,那么为什么项目项目数据就存在已释放的问题?追踪代码发现,在二主与项目选择页面传递数据是这么做的,当选择项目页面关闭时,如果是点击了保存按钮就调用选择项目页面的getData方法获取数据(var $tempData = this.getIFrameEl().contentWindow.getData();),获得数据后页面即关闭。这种方式在二主上显示正常,但是再对数据进行操作时便出现了问题。因为当页面关闭,页面的脚本被释放,原本一些函数对象指向的脚本就找不到了,因此报了标题的错误【不能执行已释放的
sript 代码】。

shit,分析到这里才知道怎么解决。我的解决方案就是换中数据传递方式:在页面关闭时,将需要的数据当成参数传递回二主页面。代码如下:

选择项目页面:
function saveData(){
var action={"flag":"ok","rows":{}};
action.rows = nui.encode({"rows":getData()});
CloseWindow(action);
}

二主页面:
if (action && action.flag == 'ok') {
var $tempData = nui.decode(action.rows).rows;

// 这里拿到的数据就可以用了.
}

转成json传递最保险了,没转换还是会报【不能执行已释放的 sript 代码】这个错误。

ps:和第一个页面没关系,提及第一个主页面只是想保留更多的开发细节,方便以后的回忆。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐