分享

vc++访问javascript(1)

 icecity1306 2015-04-01

    我们假定在VC++中已经得到网页的document指针,然后访问javascript有两种方法:一种是通过document.Script,另一种是通过document.parentWindow(以下直接用window)。它们都具有相同的效果,下面我们就以window为讨论的目标。

    在实际的网页客户端脚本开发中,我们曾经混合使用过javascript和vbscript。由于javascript的强大和灵活,在网页中已经很少再使用vbscript了,可有些场合,我们又不得不用。比如,在一个网页中嵌入realplayer播放器控件,我们可以用javascript调用realplayer控件的属性和方法,却只能用vbscript响应realplayer控件的事件。具体信息可以参见realplayer的官方帮助网页http://service./help/library/guides/extend/htmfiles/ch01_emb.htm#23018

很显然,javascript和vbscript是两个不同的脚本引擎,而且在一个页面环境中,肯定也是以不同的引擎实例而存在。然而,我们发现在两个不同脚本引擎中声明的变量和方法可以互相访问和调用。这是怎么实现的呢?我们尝试着列举几个技术要点就清楚了。

  1.  二者都支持全局对象。window就是二者的全局对象,凡是全局对象的属性和方法,在访问时,可不加上对象名。如既可以使用window.alert("hello world"),也可以使用alert("hello world");
  2. window对象包含二者实例的引用。
  3. window对象实现了IDispatchEx接口,将二者实例中的所有属性和方法,通过IDispatchEx接口向外暴露,即让外部代码认为,脚本引擎中定义的属性和方法同时也是window对象的。

比如用vbscript定义了一个echo方法。然后,在javascript中访问vbscript中的echo方法。我们分析一下是如何进行的。


<script language="vbscript">
sub echo(s)
 alert s
end sub
</script>

 

<script language="javascript">
   echo("hello world");
</script>

 

首先,vbscript中定义的echo方法,如上所述可以看作是window对象的方法进行访问。javascript引擎先在本实例的空间中查找echo方法,不成功,然后查找全局对象window,找到了,然后执行。

 

 综上所述:我们可以认为window在脚本引擎中的作用主要有三个:

  1. window作为脚本引擎的全局对象,从而使代码在访问window中的属性和方法时更简洁。如:window.alert("hello world")和alert("hello world");所以,这一个作用是可有可无的。
  2. window包含脚本引擎实例的引用,并通过IDispatchEx接口路由了脚本引擎实例中的所有属性和方法。从而使得不同脚本引擎中声明的变量和方法可以互相访问和调用。如果说没有特别的应用环境非让我们使用vbscript不可的话,对于我而言,我是会一直单纯的使用javascript的。所以,这一个作用也是可有可无的。
  3. 在VC++中我们可以得到网页的document指针,要想访问脚本引擎中的属性和方法,可以通过document.Script或者document.parentWindow(即window)。所以,这一个作用也是可有可无的。

所以,window的以上设计并非必须,只是可以让我们书写代码更简洁,应用更灵活一些而已。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多