欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法

程序员文章站 2022-03-07 11:18:48
问题 在本人目前的项目中,前端部分完全使用extjs基于“one-page”理念搭建。除了一个html作为基本容器外,就全是js文件了(页面是由js文件实现的)。当用户切换...
问题
在本人目前的项目中,前端部分完全使用extjs基于“one-page”理念搭建。除了一个html作为基本容器外,就全是js文件了(页面是由js文件实现的)。当用户切换页面时候,我们通过析构上一个页面对象,然后创建新页面对象并展现在html中。基于这种架构,我们还引入了一个activex控件,用于展现报表。这一引入,问题就出来了:只要是访问有报表控件存在的页面,用户切换2次页面,ie就会崩溃(ff无此问题),百试不爽。
原因
因为系统设计时考虑到了资源释放,专门处理过析构部分,而且无activex的页面不存在问题。故问题肯定是出在ie对包含在js中的activex控件释放出了问题。毕竟在传统的以html或jsp、php页搭建的前端中,activex是属于页面的,只要用户一跳转,页面被unload,其中的activex也就销毁了;而我们的系统使用的是通过不断的重绘一张html页面实现跳转,也就是系统永不会刷新,也就没有unload,activex自然无法销毁,导致浏览器崩溃。
解决方法
知道了原因,我们就想想法子。既然ie无法帮我们销毁activex控件。我们自己来就好了:
复制代码 代码如下:

//@acitvexobjectid: 要查找的节点范围,从此节点一下查找待删除的activex。
//@contianerid: 要删除的activex控件id。
function activexkiller(acitvexobjectid,contianerid){
var ce=document.getelementbyid(contianerid);
if (ce){
var cce=ce.children;
for(var i=0;i<cce.length;i=i+1){
if(cce[i].id==acitvexobjectid){
ce.removechild(cce[i]);
}
}
}
}

这个方法就是用来干掉activex控件的。 原理也简单。就是根据给定的一个节点范围内(一般是activex控件的父节点、容器), 用给定的activex在dom中的id来逐级查找,一旦找到就手动remove。
有了这个killer,我们就能在页面重绘之前,先搞定activex,避免了崩溃。
另外要提到的,有一个特殊情况。就是当你将一个activex控件放在了一个ext.window 里。而天真地想让ext.window在关闭的时候顺带帮你把里面的activex也销毁,就必须符合一个条件:
activex的容器必须是ext.window本身。
也就是说:如果你将activex控件放在一个ext.panel里,然后再放在ext.window里。就别指望ext.window关闭的时候可以带你的activex控件“一起走”了。
goodluck!