您的位置:首页 > 移动开发 > Objective-C

[JavaScript]页面动态添加Object元素及ActiveX控件事件关联

2011-04-01 23:25 1016 查看
引言:

  一个网页上如果有声明一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: