最近参与了一个项目,我的同事在开发一个ActiveX对象,我帮他编写JS脚本来调用这个对象,其中碰到蛮多问题,最难的就是如何响应由ActiveX对象返回的对象事件。正好,现在一起总结一下。
首先,我来介绍一下COM组件,以便说明js如何响应
COM组件
方法:
voidinit()//初始化对象
Project createProject()//创建一个Project类型的对象并返回
事件:
onInit( int_code )//当init成功后触发
Project类的结构:
方法:
voidinit()//初始化Project对象
事件:
onInit( int_code )//当init成功后触发
然后,我们在网页里创建一个ActiveX对象
<objectid="myobj"classid="CLSID:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"></object>
然后,我们定义全局的变量obj和project,来保存对象的实例,并调用他们的相关方法
varobj=null;//全局对象
varproject=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变量的值。网上搜索了一下,找到了一种很特别的方法,就是用双冒号来定义函数名,于是,修改程序如下:
varproject=obj.createProject();
functionproject::onInit( code )
{
if( code==0)
{
//Todo:
}
}
不过,运行后有报错,说project未定义,想起来,js会优先执行function这个函数定义,也就是说先定义函数,然后才执行语句。所以,function必须在project创建成功以后才能定义,因此,修改程序如下:
varproject=createProject();
varfn=function(){//定义一个函数,这个函数内部会定义我们的回调函数
//回调函数
functionproject::onInit( code )
{
if( code==0)
{
//Todo:
}
}
};
fn();//执行这个函数,也就是定义回调函数
运行了一下,确实能响应了。
后记
不知大家看到
functionproject::onInit( code ) 这样的写法,是不是觉得很奇怪?我看到这种写法以后,很吃惊,因为我从没看到过javascript有这样的语法,这看上去像是定义一个静态函数,又像是在project命名空间中定义一个函数。于是我测试了一下,发现firefox并不能识别这样的函数定义,会报语法错误,说明这个不是标准javascript的写法,是IE-Only的写法。难道是JScript的语法?我又把JScript的手册从头到尾看了一遍,也没看到类似的语法。上微软的MSDN,也没有找到双冒号的语法参考。不过,我在一个论坛里,看到了这样一段话
A second script block that defines your event handler based on the global variable. This has to be a separate script block, and the object has to be defined before this script block evaluates. Syntax is "function object::Event(params)", where "object" is the
name of the variable containing the object, "Event" is the name of the even to which you're subscribing, and "params" is the set of parameters the event handler expects. |
或许这种写法就是为了实现ActiveX的event handler而准备的吧
分享到:
相关推荐
Javascript调用ActiveX对象.docx
javascript事件冒泡,事件捕获和事件委托详解 1、事件冒泡:在javascript事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止。并不是所有的...
ActiveX组件与JavaScript交互ActiveX组件与JavaScript交互ActiveX组件与JavaScript交互
JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象(源代码)JavaScript之Date对象...
JavaScript之Math对象(源代码)JavaScript之Math对象(源代码)JavaScript之Math对象(源代码)JavaScript之Math对象(源代码)JavaScript之Math对象(源代码)JavaScript之Math对象(源代码)JavaScript之Math对象...
Javascript 面向对象的JavaScript进阶 Javascript技术
JavaScript的内置对象;字符串对象的使用;JavaScript的内置对象;JavaScript的内置对象;JavaScript的内置对象;JavaScript的内置对象;JavaScript的内置对象;Math对象的使用;JavaScript的内置对象;JavaScript的内置对象;...
javascript 中事件冒泡和事件捕获机制的详解 二者作用:描述事件触发时序问题 事件捕获:从document到触发事件的那个节点,即自上而下的去触发事件—由外到内 事件冒泡:自下而上的去触发事件—由内到外 绑定事件...
事件冒泡、事件捕获和事件委托 在javascript里,事件委托是很重要的一个东西,事件委托依靠的就是事件冒泡和捕获的机制,我先来解释一下事件冒泡和事件捕获: 事件冒泡会从当前触发的事件目标一级一级往上传递,...
JavaScript利用ActiveX导出Excel,Word
javascript捕获窗口关闭事件有两种方法
JavaScript 使用ActiveX实现在Excel文件中插入图片
JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库
《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...
事件对象;JavaScript的事件;JavaScript的事件;JavaScript的事件;JavaScript的事件;JavaScript的事件;JavaScript的事件;JavaScript的事件;JavaScript的事件;JavaScript的事件;JavaScript的事件;JavaScript的事件;...
javascript的document对象
java\JavaScript利用ActiveX导出Excel,Word .doc
JavaScript内置对象相关介绍及用法ppt JavaScript内置对象相关介绍及用法
JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)JavaScript内置对象(ppt)...
面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的...