WEB开发下面DIV层被OCX控件拦住问题的解决思想,以及结合EXTJS的解决方法

公司开发的WEB程序里面嵌入了一个大控件(ocx)。嵌入控件这种模式自然有它自身的好处,但是却有着一些致命的缺点......我个人认为能不用尽量不用,嵌入控件的WEB程序总觉得点不伦不类。
牢骚发完了,言归正传。



控件分为有窗口控件与无窗口控件,无窗口控件很好办

,如flash控件,可以通过添加wmode属性来解决挡住DIV层这个问题,添加的代码如下:
² 代码1-2 解决无窗口控件挡住DIV

<param name="wmode" value="opaque">









这种情况在使用DIV的网页里的测试如下







测试的代码是:

² 代码1-1 测试DIV与OCX控件

<div

style="position: absolute; left: 120; top: 450; width: 400px; height: 200px; background: red; z-index: 7">

<object classid="CLSID:4B5BEE59-EDD2-4082-A9F7-D65E1CA20FA7"width="100" height="100">

</object>

是第6层

</div>

<div

style="position: absolute; left: 40; top: 500; width: 400px; height: 100px; background: Blue; z-index: 9">

这是第7层

</div>

这是第7层

</div>

这种情况在EXTJS下边的测试情况如下图:






相关测试代码请参考代码1-1

注:如果我们的控件是一个无窗口控件如flash控件,可以通过添加wmode属性来解决挡住DIV层这个问题,添加的代码如下:

² 代码1-2 解决无窗口控件挡住DIV

<param name="wmode" value="opaque">



Ø 如何解决这些问题

值得庆幸的是Html的iframe、frame可以挡住OCX控件——实际上iframe以及frame本身是一个有窗口元素,有窗口元素之间是可以互相遮挡的,而我们的Div又可以与iframe窗口互相遮挡。 现在的问题变成了如何先用iframe挡住OCX窗口再用DIV挡住iframe。



² Code 2-1 用iframe遮挡OCX控件

<div

style="position: absolute; left: 120; top: 450; width: 400px; height: 200px; background: red; z-index: 7">

<object classid="CLSID:4B5BEE59-EDD2-4082-A9F7-D65E1CA20FA7"width="100" height="100">

</object>

是第6层

</div>

<div

style="position: absolute; left: 40; top: 500; width: 400px; height: 100px; background: Blue; z-index: 9">

<iframe id='iframei' src="javascript:false" style="position:absolute; visibility:inherit; top:0px; left:0px; height:'100%';width:'100%'; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';/">

</iframe>;

这是第7层

</div>



其中代码”

<iframe id='iframei' src="javascript:false" style="position:absolute; visibility:inherit; top:0px; left:0px; height:'100%';width:'100%'; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';/"></iframe>;”

就是创建一个与DIV等大的,透明的iframe框架。

实现的效果如下图:







现在我们已经解决了如何用DIV去遮挡OCX这个问题了。接下来我们要做的是如何去改造EXTJS类来让它们也可以挡住OCX控件。



EXTJS中对控件参用了继承的方法来实现扩展,所以我们只许要实现对恰当的父类进行改造就可以了,这里我们选择Panel类。接下我们将会在panel类里面添加一个等大的,透明的iframe窗口。以后在使用创建的panel控件,以及继承自panel的控件(如:window)都可以实现遮挡住OCX控件了。——继承的优势再一次得到的很好的体现。

由于要修改EXTJS的原码,所以我们使用它的Debug版本。

我们也许不想所有的panel以及其子孙下边都藏着一个iframe,所以这里我们添加一个属性来控制是否要添加一个iframe。实现如下



Ext.Panel = Ext.extend(Ext.Container, {



hasIframe: false,

……

下边我们就在实例化一个panel(或者其子孙)时添加一个iframe吧。

我选择了在panel渲染onRender时加入自己的代码:

onRender : function(ct, position) {

Ext.Panel.superclass.onRender.call(this, ct, position);

var el = this.el, d = el.dom;

// el 下边加入我们的iFrame

if (this.hasIframe)

{

var iframeid=this.id+"_iframe"

d.innerHTML+="<iframe id='"+iframeid+"' src=/"javascript:false/" style=/"position:absolute; visibility:inherit; top:0px; left:0px; height:'100%';width:'100%'; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';/"></iframe>";

}

......

}

OK现在在创建panel或者其子孙时我们只要设置一个属性

hasIframe: true,

就可以实现遮挡住OCX控件的功能了。




问题到了这里仿佛已经得到了完美的解决,但是当我们尝试着去拖动,或者拖曳这些窗口时有时你会发现一起很怪的现向,例如窗口扩大后有一部分无法遮挡住OCX控件,无法在OCX控件上面进行拖曳或者移动。

这是为什么呢?

第一个问题:为什么窗口的一部分可以挡住OCX控件呢?我明明把底层的iframe高度设置成了100%了!设置100%的意思是跟它外层的容器(这里是DIV)大小是一样的。 通过方法把最终的代码alert出来后才发现默认情况下它外层容器的高度是不显示出来的——为什么要这样设计,我也不知道。最简单的方法就是明确地给外层容器设置调度,并在拖曳时再给它们设置高度(panel的大小是不可以改变的,它的子类例如window是可以的)。OK那就再费点现设置一下吧。

第一步在panel实例化时设置一下高度

onRender : function(ct, position) {

……

this.el.dom.style.height=this.height; //高度

第二步在 window拖曳时改变一下容器调度

onResize : function(w, h) {

if(this.hasIframe) {

this.el.dom.style.height=h; //拖动的时候重新设置了高度



第二个问题: 在拖动层的过程中发现OCX又冒出来了,而且经过OCX时拖动就失败了。这时为什么呢?EXT拖动层时不是把层里面的所有元件(Elements)一起拖动,它只是拖动了最外层的容器,拖动结束后再在新位置上重新绘制元件——多好的设计呀,可惜在这里遇到了问题。那好吧,在拖动时把我们iframe也一起拖动不就OK了?

我们为

startDrag : function() {

………

if (this.win.hasIframe)

{

var newiframe= Ext.getDom(this.win.id+'_newiframe');

if (newiframe)

{

}

else

{

this.proxy.dom.innerHTML+="<iframe id='"+this.win.id+'_newiframe' +"' src=/"javascript:false/" style=/"position:absolute; visibility:inherit; top:0; left:0; width:100%; height:100%; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';/"></iframe>";

}

}

到这里前算是把拖曳问题解决的差不多了,为什么说是差不多了呢?你在实现使用时就会发现有点问题了。

第三个问题:在拖曳经过OCX时就变的无效了

这里不想说原因,说说解决方法吧。没找到更好的解决方法,现在的做法是在拖曳时让底层的iframe临时扩大的全屏,拖完以后再还原回来。

beforeResize : function() {

……

//拖动之前 把它的底层iframe 扩展到最大

if (this.hasIframe)

{

var divIframe=Ext.getDom(this.id+'_iframe');

divIframe.style.top=-2000;

divIframe.style.left=-2000;

divIframe.style.height=4000;

divIframe.style.width=4000;

}



},

handleResize : function(box) {

……

if(this.hasIframe) {

var divIframe= Ext.getDom(this.id+'_iframe');

divIframe.style.height='100%';

divIframe.style.width='100%';

divIframe.style.top=0;

divIframe.style.left=0;

divIframe.style.position='absolute';

this.el.dom.style.height=box.y; //拖动的时候重新设置了高度

}



},



后记:

1)

使用类似方方法我们可以解决 EXJS里面尽乎所有的DIV被OCX拦住的问题——笔都解决了菜单,面板,窗口,消息框

2)

当然我们可以能过 Ext.DomHelper.append方法把我们的代码写的优雅一点...。。

Ext.DomHelper.append(this.el.dom, {
tag : 'iframe',
id: iframeid,
style : "position:absolute; visibility:inherit; top:0; left:0; width:100%; height:100%; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'",
src : 'javascript:false'

})

如果在EXTJS实现,只需要加上一句全局开关

Ext.useShims =true

在创建各种window的时候加上一句全局开关Ext.useShims=true,给window加上属性shim=true(其实不用加,默认就是true)。
好了,只要一句Ext.useShims=true,就可以遮挡ActiveX了,原来这么简单,layer就是加shim,shadow的,这个shim我还以为是两端间隙,没想到是一个遮挡层。

所谓有现成的方法不用,就是傻蛋啊
解决控件遮挡问题:关于有窗口元素和无窗口元素 不知道朋友们有没有碰到过控件的遮挡问题,最典型的就是DropdownList和ActiveX的遮挡,HTML的z-index就是用于处理这个问题,但是直接设置这个属性还不行,因为这中间还牵扯到有窗口元素和无窗口元素的问题。 有窗口元素大概有以下几种:  <object> 、ActiveX控件 、Plug-ins、DHTML Scriptlets、SELECT elements(即DropdownList的HTML表现)、IE5.01以前的IFRAMEs  无窗口元素包括:  无窗口的ActiveX控件、IE5.5以后的IFRAMEs、大部分的DHTML元素  其中很值得一提的就是ActiveX 立即下载

相关推荐

HFSS实战(三)——过孔via TDR仿真

在上一讲中,主要是通过观察S参数确定via的优化是否达到目标。但S参数只能看到一个整体的结果,并不知道via真实的阻抗是多少?想要单独确定via的阻抗,最好还是通过TDR的仿真。

luohuo9844的博客 1万+

解决Active控件的遮挡问题

网上有一些解决方法,比如说用frame的方式,又如flash插件可以用设置特定属性解决,这里解决的是Active的遮挡问题,例如WebOffice控件遮挡了界面的下拉列表,目前发现利用Ext的内置方式可以解决。在页面加载完成后调用Ext.useShims=true;即可解决控件遮

人去留香 1393

STM32 Modbus-RTU从零到实战:手把手教你用HAL库实现工业通信(附完整代码)

本文详细介绍了如何使用STM32 HAL库从零开始实现Modbus-RTU从机通信。内容涵盖RS485硬件设计、CubeMX串口与定时器配置、基于空闲中断的高效数据接收、协议栈状态机设计、CRC16校验实现以及常用功能码处理。文章提供了完整的代码框架和调试方法,帮助开发者快速构建稳定的工业通信节点。

weixin_28278377的博客 186

easyui控件与Activex控件遮挡问题

最近在开发easyui控件过程中遇到了下拉框combobx控件被activex控件遮挡的问题,在网上查找了半天都是说添加iframe(),试了半天,还是不行。最后耐着性子在页面页码和jquery.easyui.min.js源码里结合找问题。最后在两个地方加入iframe起到作用。 两个地方分别是1、combo初始化控件时 2、combo加载数据项时 如果在这两个地方分别加入iframe 就能达

benbenchong_ok的专栏 2949

用Typora画流程图和序列图:Mermaid语法实战教程(含常见报错解决)

本文是一份详细的Typora与Mermaid语法实战教程,教你如何在Markdown文档中高效绘制流程图和序列图。文章涵盖从环境配置、核心语法到复杂图表构建的全过程,并重点解析了常见报错原因与解决方案,助你将可视化图表无缝融入文档工作流。

weixin_29279101的博客 299

基于 YOLOv26 的车辆违规停车检测系统:实时监控

本文提出了一种基于YOLOv26的车辆违规停车实时检测系统。系统采用多模块架构,包括视频预处理、YOLOv26目标检测、DeepSORT目标跟踪、停车区域定义、行为分析和违规判定等功能模块。关键技术包括使用YOLOv26s模型进行车辆检测,结合DeepSORT算法实现车辆跟踪,支持多种停车区域定义方式(多边形、矩形、限时区域等)。系统通过边缘计算平台部署,实现了对道路边、禁止停车区等场景的实时监控,能够准确识别长时间停车、禁止区域停车等违规行为,并触发告警机制。实验结果表明,该系统在车辆检测准确率和违规判定

一键难忘的博客 773

网页上的元素(对话框)被ActiveX控件遮挡住,怎么把它显示出来呢?

查了这么多资料,大都很模糊,没有解决控件遮挡问题,说什么z-index之类的,都没说到点子上或者原理性东西,终于查到了这篇博文,发现其中讲解了原理东西,从窗口元素和五窗口元素就行区分就了解了为啥出现遮挡问题了。 说到这个问题,那就要先了解网页上的元素分为几种? 一般来说,分为有窗口元素和无窗口元素, 有窗口 元素大概有以下几种: <object>、ActiveX控件、Plu...

MFWSCQ的博客 1529

YOLOv12 改进 | Backbone改进 3

将CSP中的简单拼接改为可学习的特征选择门控,动态决定哪些特征流向下一层,同样再写这篇。:相比静态CSP的固定50/50分割,门控机制可学习0.3:0.7等最优比例。在输入端加入轻量SR模块,对下采样后的特征进行超分恢复,提升小目标检测能力。(小目标): 从 0.51 AP → 0.63 AP (+24%):采用ESPCN的高效亚像素卷积,避免传统插值的信息损失。:从通道级(SE)到空间级(Spatial)的多粒度控制。:结合浅层细节和深层语义,恢复小目标的纹理信息。

u012133341的博客 841

关于WEB开发下面DIV层被OCX控件拦住问题

控件分为有窗口控件与无窗口控件,无窗口控件很好办,如flash控件,可以通过添加wmode属性来解决挡住DIV层这个问题,添加的代码如下: 解决无窗口控件挡住DIV: 1 <paramname="wmode"value="opaque"> 这种情况在使用DIV的网页里的测试如下: 测试的代码是: ...

u013725001的专栏 652

SAP S/4 HANA CO 成本模块实战指南

摘要:SAP S/4HANA CO(管理会计)模块是企业内部成本管理的核心工具。本文系统介绍了CO模块的组织结构(控制范围与会计科目表映射)、基础概念(计划值与预算值)以及6大子模块功能(成本要素、成本中心会计等)。重点解析了各子模块的应用场景与差异,包括成本归集、费用分摊、利润分析和产品成本控制,并对比了利润中心与成本中心、内部订单与销售订单的区别。通过事务代码示例和功能对比表,帮助用户快速掌握SAP CO模块的核心管理逻辑与实施要点。

金牌架构师 1125

9.23华为OD机试真题 新系统 - 世界杯徽章换购 (Java/Py/C/C++/Js/Go)

9.23华为OD机试真题 新系统 - 世界杯徽章换购 (Java/Py/C/C++/Js/Go)

算法大师! 1588

DIV弹出层无法遮罩ActiveX控件的解决方案

本文内容参考网上实例,结合自己实践进行总结 参考地址:https://www.evget.com/article/2011/10/11/16665.html 自己实现代码: var nowindex = $("#PreviewOcx").css('z-index'); //这个地方最好使用ActiveX容器object,并且在html中不要手动设置该object的zindex, 自己设置过...

wangdaoyin2010的专栏 1702

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

a_zxswer的博客 190

解决上层dom遮挡下层dom时无法触发click等事件的问题

解决上层dom遮挡下层dom时无法触发click等事件的问题

weixin_64962562的博客 719

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

DIV浮动层被OCX控件遮蔽解决方案

在开发中需要在网页中嵌入OCX控件,但是控件嵌入后,总是会出现在网页最顶层,页面中的浮动DIV总是不能正常显示,会被遮蔽掉,那么这里就需要特殊处理一下: OBJECT会遮蔽掉页面内容,但是IFRAME又可以遮蔽掉OBJECT,而DIV可以遮蔽掉IFRAME,所以我们在浮动的DIV中放入一个IFRAME,让IFRAME遮蔽OBJECT、DIV遮蔽IFRAME 代码: <iframe  

Kemin 7798

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

使用ActiveX插件时object显示问题,div被object标签遮挡的解决方案

浏览器中object显示问题起因解决方案方法一: 直接设置属性值方法二:iframe结论 起因 设计要求视频控制面板显示在视频界面上,如下图红框内所示。但是因为object不在文档流之中,所以不论别的元素设置z-index多高,都只会被object元素遮住而无法看到。 object元素代码如下 <object id="EZUIKit" width="400" height="4...

weixin_44849078的博客 5734

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

关于jquery dialog被activeX插件遮挡问题的解决办法

项目中遇到了jquery dialog被遮挡的问题,通过查找资料,发现通过添加iframe即可解决该问题 1.在初始化dialog时添加dialogClass: "my-dialog"; 2. 在dialog被打开之前追加iframe   $(".my-dialog").append(""); 至此问题解决!!!

zcs100的专栏 2364

activex插件遮盖问题的处理

最近在做一个

hhhh2012的专栏 1017

div 被Object盖住的。解决办法

今天遇到一个比较头疼的问题,就是在一个标签上右键,弹出的菜单div被标签内的Office控件Object挡住了下半部分,始终无法显示。查了好多解决方案,最终都不能解决问题,几乎都要放弃了。中午吃饭的时候,脑海中又一个劲儿的想这个问题,突然,来了一点灵感,回去之后,抓紧时间试了一下,终于解决了!终于可以放松一下了!以下是该问题解决的一点总结,希望对大家有所帮助! <div id="con...

weixin_30530523的博客 607

在Web上调用Ocx控件

<br />在HTML页面中使用ActiveX控件包含三个基本操作:将控件放入HTML中;将该控件下载给用户;在用户机器上安装该控件。如果只是针对IE用户,在HTML中插入ActiveX控件就比较简单;如果同时兼顾IE和Netscape用户,则要做更多工作。大家知道,HTML文件由文本和各种标志 (tags)组成,ActiveX 控件对于IE在HTML中的标志是<OBJECT>,该标记有几个重要的参数特性,它们是: <br />1.ID:为控件提供一个标识名称,为HTML代码提供一种访问该控件的方式。 <b

goodadult2012的专栏 3万+

MFC ActiveX (ocx)控件的开发

MFC ActiveX (ocx)开发

hk的博客 3万+
上一篇: ExtJs中xtype与组件类的对应表
下一篇: 把JBPM部署到tomcat6下的时候报出
dot_dot
博客等级 码龄21年 3粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值