JavaScript使用ACTIVEX控件引起崩溃问题的解决


问题

在本人目前的项目中,前端部分完全使用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!

posted on 2010-03-31 15:47 yueue 阅读(1808) 评论(9) 编辑 收藏

评论

#1楼 2010-03-31 16:00 刘领福      

 回复 引用 查看   

#2楼 2010-03-31 16:30 布尔      

OnePage还需要改进  回复 引用 查看   

#3楼 2010-03-31 16:48 挑战自我      

恩。好  回复 引用 查看   

#4楼[楼主] 2010-03-31 17:07 yueue      

@布尔
请赐教
 回复 引用 查看   

#5楼 2010-03-31 18:14 布尔      

既然是OnePage为什么还需要一次次构建一个完整的Html文档呢,其实更新部分容器内容就可以了,我就是这么做的,我看我有时间把我的做法写出来  回复 引用 查看   

#6楼[楼主] 2010-03-31 18:20 yueue      

@布尔
当然是每次改变一个部分咯。可能我没描述清楚
 回复 引用 查看   

#7楼 2010-03-31 20:19 布尔      

@yueue
似乎我也遇见过这个问题,我的建议是把activex控件封装一下,然后把销毁工作封装进去,省的在全剧调用销毁。
 回复 引用 查看   

#8楼 2010-04-01 08:17 minttang      

本质上与ext无关,很多js库都会这样。  回复 引用 查看   

#9楼 2010-12-13 00:20 Alan@Net      

 回复 引用 查看   

导航

公告

昵称:yueue
园龄:5年2个月
粉丝:3
关注:0
<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

搜索

 

随笔分类

随笔档案

Links

最新评论

阅读排行榜