在HTML/Javascript中处理ActiveX控件属性触发的事件

5
以下HTML对象代表具有名为SubSystemA的属性的ActiveX控件:
<object id="MainObject"
    CLASSID="CLSID:2C327457-D12F-4FC4-BFC2-D7C029003D07"
    width="0px" height="0px"
    >
    <embed name="MainObject"></embed>
</object>

SubSystemA是一个实现了一些接口、有方法、属性和事件的COM对象。SubSystemA的方法和属性可以很容易地从Javascript中调用,但由于SubSystemA是MainObject的一个属性,我不确定如何将事件处理器附加到SubSystemA的事件上。

我知道两种处理MainObject触发的事件的方法:

<script type="text/javascript">
    function MainObject::SomeMainEvent(arg1, arg2)
    {
         // Event handling logic
    }
</script>

并且

<script type="text/javascript" for="MainObject" event="SomeMainEvent(arg1, arg2)">
    // Event handling logic
</script>

但是如何处理MainObject.SubSystemA的事件呢?

2个回答

1
我发现以下代码可以正常工作:
<object id="MainObject"
    CLASSID="CLSID:2C327457-D12F-4FC4-BFC2-D7C029003D07"
    width="0px" height="0px"
    >
    <embed name="MainObject"></embed>
</object>

<script type="text/javascript">
    function MainObject.SubSystemA::SomeSubSystemEvent(arg1)
    {
         // Event handling logic
    }
</script>

我目前正在寻找一种适应<script for="..." event="...">语法的方法,因为它似乎允许后期绑定而现有的语法则不行。


有点晚了,但你能详细说明一下 <script for= 如何比 :: 语法更支持后期绑定吗? - Zev Spitz

1

我发现在子对象上执行事件的最简单方法是自己实现attachEvent和detachEvent,这样可以允许JavaScript实现事件。只需保存传入的函数的IDispatch*,然后迭代它们并在每个函数上调用Invoke,DISPID=0。

对于MainObject本身,您可能需要使用连接点,其工作方式略有不同。

FireBreath为IE和Firefox抽象了所有这些内容,包括创建单独的COM对象。值得一看。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接