关于配置脚本的“不能执行已释放Script的代码”的问题
2008年10月14日这是由于脚本把某些原本在top中定义的函数用bottom中脚本的函数来替换,而当bottom区重新装载的时候脚本也随之重载,在重载没有完成的时候如果遇到这些函数的调用就会出现“不能执行已释放Script的代码”的错误。
解决办法是:在进行函数替换之前,先把原来的函数以另一个名字保存,当bottom区重载的时候用window.onunload事件触发把函数替换回原来在top中的定义。
例子代码如下:
var old_func_write_new; var old_func_writemiclist; var old_func_writecv; var old_func_writeu1; var old_func_writecv_new; var old_func_writev_new; var old_func_Users_Add; var old_func_Users_Add1; var old_func_Users_Del; var old_func_addusertolist; var old_func_deluserfromlist; function replace_functions(){ old_func_write_new=parent.write_new; old_func_writemiclist=parent.writemiclist; old_func_writecv=parent.writecv; old_func_writeu1=parent.writeu1; old_func_writecv_new=parent.writecv_new; old_func_writev_new=parent.writev_new; old_func_Users_Add=parent.Users_Add; old_func_Users_Add1=parent.Users_Add1; old_func_Users_Del=parent.Users_Del; old_func_addusertolist=parent.addusertolist; old_func_deluserfromlist=parent.deluserfromlist; parent.write_new=writelist;//重新聊友列表 parent.writemiclist = writemiclist;//重写麦序区 parent.writecv = writecv;//重写语音区代码 parent.writeu1 = writeu1;//重写分屏区 parent.writecv_new=writecv; parent.writev_new = writev_new; parent.Users_Add = Users_Add; parent.Users_Add1 = Users_Add1; parent.Users_Del = Users_Del; parent.addusertolist = addusertolist; parent.deluserfromlist = deluserfromlist; } function recover_functions(){ parent.write_new=old_func_write_new; parent.writemiclist = old_func_writemiclist; parent.writecv = old_func_writecv; parent.writeu1 = old_func_writeu1; parent.writecv_new=old_func_writecv_new; parent.writev_new = old_func_writev_new; parent.Users_Add = old_func_Users_Add; parent.Users_Add1 = old_func_Users_Add1; parent.Users_Del = old_func_Users_Del; parent.addusertolist = old_func_addusertolist; parent.deluserfromlist = old_func_deluserfromlist; } function init_system() { window.onerror=new Function("return true"); . . replace_functions(); window.onunload=recover_functions; . . } |
特别对于象”Users_Add”这样的函数在bottom刷新的时候正好是用户状态改变的时候,例如上管的情况,就会被调用。