用Javascript捕获ActiveX对象的事件 最近参与了一个项目,我的同事在开发一个ActiveX对象,我帮他编写JS脚本来调用这个对象,其中碰到蛮多问题,最难的就是如何响应由ActiveX对象返回的对象事件。正好,现在一起总结一下。 首先,我来介绍一下COM组件,以便说明js如何响应 COM组件 方法: void init() //初始化对象 Project createProject() //创建一个Project类型的对象并返回 事件: onInit( int_code ) //当init成功后触发 Project类的结构: 方法: void init() //初始化Project对象 事件: onInit( int_code ) //当init成功后触发 然后,我们在网页里创建一个ActiveX对象 <object id="myobj" classid="CLSID:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"></object> 然后,我们定义全局的变量obj和project,来保存对象的实例,并调用他们的相关方法 var obj = null; //全局对象 var project = null; //Project对象 window.onload = function(){ obj = document.getElementById('myobj'); //获取对象 obj.init(); //初始化对象 project = obj.createProject(); //创建project对象 project.init(); //调用project对象的方法 }; 最常见的对象事件响应方法 最常见的莫过于使用script event for的标签语法来响应对象事件了,Windows Media Player就是这样做的 <script language="Javascript" event="onInit( code )" for="myobj"> if ( code == 0 ) { //Todo: } </script> for属性指定了这个事件响应的对象是myobj,注意,这里要写object标签的id,不能是js变量 event属性指定了要响应哪个事件,这里是onInit事件。 如何响应ActiveX对象返回的对象事件 现在问题来了,我们调用了createProject方法,得到了一个project对象。这个对象也有事件,那么这时应该如何来响应呢? 显然,用之前的script event for的方法是不行的,因为for属性不能指定js变量的值。网上搜索了一下,找到了一种很特别的方法,就是用双冒号来定义函数名,于是,修改程序如下: var project = obj.createProject(); function project::onInit( code ) { if ( code == 0 ) { //Todo: } } 不过,运行后有报错,说project未定义,想起来,js会优先执行function这个函数定义,也就是说先定义函数,然后才执行语句。所以,function必须在project创建成功以后才能定义,因此,修改程序如下: var project = createProject(); var fn = function(){ //定义一个函数,这个函数内部会定义我们的回调函数 //回调函数 function project::onInit( code ) { if ( code == 0 ) { //Todo: } } }; fn(); //执行这个函数,也就是定义回调函数 运行了一下,确实能响应了。
温馨提示:答案为网友推荐,仅供参考