[JavaScript]页面动态添加Object元素及ActiveX控件事件关联
2011-04-01 23:25
1016 查看
引言:
一个网页上如果有声明一个Object元素,假设是某个证件阅读机的ocx ActiveX控件。页面声明如下:
如果用户没有安装这个控件,那么浏览器(本文仅就IE而言,下同)会自动搜索;如果页面有声明codebase属性,就会自动从此链接下载。遗憾的是,如果本地既没安装,下载未指定或下载失败,那么经过漫长等待才告诉用户加载失败。有时候还会导致整个页面加载出现一片空白。用户经过漫长等待,看到的页面是空白,最后才提示没有加载成功,这种用户体验是很差的。
最近的一个项目就是这样,项目用到几个型号的证件阅读机,采用调用ocx控件,触发阅读机的刷卡识别事件。由于用户不会将所有型号的阅读机控件都装上(因为基本上固定使用某个型号的),所以,原来页面上声明了多个Object元素,如果有没安装的控件(哪怕是一个),就会导致整个页面加载严重缓慢,基本上需要1-2分钟才能完全加载完毕。
解决方案:
遇到这个问题,首先想到的就是等整个页面加载完毕后,根据用户所选的阅读机类型,再用JavaScript DOM动态创建(声明)Object元素。这样可以避免加载没用到的控件,避免页面加载过慢。
DOM创建、添加元素具体就不详述了。但问题是,怎么将元素和阅读机的事件触发关联起来?原来的控件调用部分使用vbscript写的。经过网上查阅资料,发现vb的事件handler名是 控件的id+事件名称,但是在JavaScript显然是行不通的。后来上网找到资料说,JavaScript下关联事件是用这样的形式:
[1]中所写“事件关联函数要放在ActiveX控件代码的上面,否则接收不到事件通知。”,经测试不用如此也可以接收到事件,只要页面有关联事件的代码即可(也有可能页面没有完全加载完毕就需要触发ActiveX事件执行,这个时候最好是放在元素声明的前面)。
留待解决的问题
也尝试过用attachEvent(IE下, 非IE用其他函数)来将事件关联到动态创建的元素上(根据[3]所言:事件参数无法取得,这个结论本人未验证), 测试发现, 部分事件关联成功, 但是阅读机识别的事件却没有触发, 其他事件都触发了, 不知和解?
备注:
ActiveX的classid在ActiveX控件注册后在注册表可以查找到,ActiveX的事件和属性可以通过Visual Studio的对象浏览器看到。
参考文档:
[1]ActiveX与JS交互, http://www.cnblogs.com/zdxster/archive/2011/01/27/1945879.html
[2]JavaScript调用Activex控件的事件的实现方法,http://www.jb51.net/article/22996.htm
[3]如何取回ActiveX事件的返回值,http://topic.csdn.net/t/20021018/10/1105929.html
一个网页上如果有声明一个Object元素,假设是某个证件阅读机的ocx ActiveX控件。页面声明如下:
<object id="TEST" classid="clsid:AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA" width="0" height="0"></object>
如果用户没有安装这个控件,那么浏览器(本文仅就IE而言,下同)会自动搜索;如果页面有声明codebase属性,就会自动从此链接下载。遗憾的是,如果本地既没安装,下载未指定或下载失败,那么经过漫长等待才告诉用户加载失败。有时候还会导致整个页面加载出现一片空白。用户经过漫长等待,看到的页面是空白,最后才提示没有加载成功,这种用户体验是很差的。
最近的一个项目就是这样,项目用到几个型号的证件阅读机,采用调用ocx控件,触发阅读机的刷卡识别事件。由于用户不会将所有型号的阅读机控件都装上(因为基本上固定使用某个型号的),所以,原来页面上声明了多个Object元素,如果有没安装的控件(哪怕是一个),就会导致整个页面加载严重缓慢,基本上需要1-2分钟才能完全加载完毕。
解决方案:
遇到这个问题,首先想到的就是等整个页面加载完毕后,根据用户所选的阅读机类型,再用JavaScript DOM动态创建(声明)Object元素。这样可以避免加载没用到的控件,避免页面加载过慢。
DOM创建、添加元素具体就不详述了。但问题是,怎么将元素和阅读机的事件触发关联起来?原来的控件调用部分使用vbscript写的。经过网上查阅资料,发现vb的事件handler名是 控件的id+事件名称,但是在JavaScript显然是行不通的。后来上网找到资料说,JavaScript下关联事件是用这样的形式:
<script type="text/javascript" for="控件ID" event="事件处理函数名"> //事件handler alert(); </script>
[1]中所写“事件关联函数要放在ActiveX控件代码的上面,否则接收不到事件通知。”,经测试不用如此也可以接收到事件,只要页面有关联事件的代码即可(也有可能页面没有完全加载完毕就需要触发ActiveX事件执行,这个时候最好是放在元素声明的前面)。
留待解决的问题
也尝试过用attachEvent(IE下, 非IE用其他函数)来将事件关联到动态创建的元素上(根据[3]所言:事件参数无法取得,这个结论本人未验证), 测试发现, 部分事件关联成功, 但是阅读机识别的事件却没有触发, 其他事件都触发了, 不知和解?
备注:
ActiveX的classid在ActiveX控件注册后在注册表可以查找到,ActiveX的事件和属性可以通过Visual Studio的对象浏览器看到。
参考文档:
[1]ActiveX与JS交互, http://www.cnblogs.com/zdxster/archive/2011/01/27/1945879.html
[2]JavaScript调用Activex控件的事件的实现方法,http://www.jb51.net/article/22996.htm
[3]如何取回ActiveX事件的返回值,http://topic.csdn.net/t/20021018/10/1105929.html
相关文章推荐
- 如何让动态创建的页面元素响应用户事件 (HTML/javascript/jQuery/Ajax/DOM)
- JavaScript动态改变HTML页面元素例如添加或删除
- JavaScript动态改变HTML页面元素例如添加或删除
- 页面元素用JS动态添加的有效事件绑定方式(on)
- JavaScript为元素动态添加事件之(attachEvent||addEventListener)
- javascript,jquery动态添加dom元素,并设定css属性,点击事件
- 动态添加页面元素事件
- 页面元素用JS动态添加的有效事件绑定方式
- Jquery 页面元素动态添加后绑定事件丢失方法,非 live
- JAVASCRIPT动态的为元素添加事件
- jQuery页面元素动态添加后绑定事件丢失方法,非 live
- JavaScript动态的为元素添加事件
- JavaScript动态的为元素添加事件
- JavaScript动态的为元素添加事件
- Javascript 给页面元素添加事件函数探讨
- JavaScript动态的为元素添加事件
- 如何为页面动态生成的元素添加事件(如append()动态添加的标签)
- Javascript为元素动态的添加事件包括两种情况:
- Javascript 给页面元素添加事件函数探讨
- Javascript 给页面元素添加时间函数探讨