JavaScript使用ACTIVEX控件引起崩溃问题的解决(IE9关闭含有vb6编写的ActiveX控件引起崩溃的问题)

问题:IE9关闭含有vb6编写的ActiveX控件的页面时引起应用程序崩溃的错误,原因是IE9关闭页面时没有自动释放控件造成的,可在前端页面的关闭事件前通过先移除ActiveX控件节点解决。

 

<object id="drawer" classid="clsid:CB3ED481-E9F0-4092-BDBF-FE14B2CB5AD9" ></object>
<object id="CreditCard" classid="clsid:3AAE467F-1DBF-4FDC-BB26-A04174EA6A44" ></object>

............

window.onbeforeunload = function () {
// 窗口关闭前,先移除这两个控件
var drawerControl = document.getElementById("drawer");
var creditCardControl = document.getElementById("CreditCard");
document.body.removeChild(drawerControl);
document.body.removeChild(creditCardControl);
}

 

 

 

完整代码如下:

<html>
<body>
    <object id="drawer" classid="clsid:CB3ED481-E9F0-4092-BDBF-FE14B2CB5AD9" codebase="./POS5G_GCL_WEB/activeX/pos5ghkprint.cab#version=1,0,0,51"></object>
    <object id="CreditCard" classid="clsid:3AAE467F-1DBF-4FDC-BB26-A04174EA6A44" codebase="./POS5G_GCL_WEB/activeX/CreditCard.cab#version=1,0,0,7"></object>
    <object id="POSPrint5G" classid="clsid:BE9F05A9-A560-441F-AC7E-B50C2840980D" codebase="./POS5G_GCL_WEB/activeX/PF.cab#version=1,0,0,37"></object>

    <p>点击按钮或者右上角X图标关闭当前窗口</p>
    <button οnclick="test()">window.close()</button>

    <script>
        window.onbeforeunload = function () {
            // 窗口关闭前,先移除这两个控件
            var drawerControl = document.getElementById("drawer");
            var creditCardControl = document.getElementById("CreditCard");
            document.body.removeChild(drawerControl);
            document.body.removeChild(creditCardControl);
        }
        function test() {
            try {
                window.close();
            } catch (err) {
                alert(err.message)
            }
        }
    </script>
</body>
</html>

 

————————————————————————————————————————

原因可参考 https://blog.csdn.net/whatday/article/details/8152648,原文如下:

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控件“一起走”了。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高拍仪控件集成,即各类应用软件系统通过集成高拍仪控件解决在java、.net、php等软件开发中遇到的高拍仪编程操作问题,快速在asp.net、jsp、asp等web项目中调用高拍仪设备,使得用户办公流程更便捷、顺畅。 捷宇·高拍仪SDK 二次开发包操作性能怎么样? 捷宇 高拍仪系统集成服务,可以为各类办公OA系统、协同办公平台、数据管理平台、数据库系统提供提供ActiveX 版和DLL 版的完整二次 SDK 开发包。可实现高效、高质量存储影像文档,同时支持自动校正、去黑边、获取BMP 位图(24 位)的Base64 编码数据、图像压缩、防伪水印、网页本地图像删除、图像列表生成、上传指定图片到服务器和支持拍摄多页TIF 多页PDF 生成、条形码识别等功能。可通过VB、ASP.NET、 Delphi、C++ 、PB 或JavaScript等不同程序语言调用SDK APIs。全程提供开发集成服务。 捷宇 智汇星 高拍仪 二次开发服务的优势有哪些? 捷宇 高拍仪是国内高拍仪行业里少数几个能自己编写高拍仪软件的厂家。配套软件系我司自主开发编写,所有源程序可控,功能接口最丰富,目前已达到70几个可用的接口,并已申请软件著作权。软件开发集成响应速度快,变更灵活,可根据客户的集成要求量身定制,在建设银行(总行)、广东移动、南方电网、福建公安、广西公安等一批重点高拍仪项目测试评选中脱颖而出,成为便捷性最好,安全性最高的高拍仪设备供应商,并成功为客户服务。 市场上贴牌代工的高拍仪软件大部分是直接调用控件来实现高拍仪的控制功能,如“德易拍”“光捷”“吉星”“创合”“中晶”高拍仪等,软件安全性差,容易复制,存在安全漏洞。单位客户使用时可能会遭遇信息安全泄露的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值