在DHTML中响应ActiveX控件的事件

ActiveX控件可以用连接点创建事件,此事件可以在DHTML网页中被javascript函数处理,在js中响应ActiveX控件事件的方法如下:

1. 静态创建方法
<script>

  function  OnEvent1()
  {
  }

</script>
<OBJECT id="myControl"
                   codeBase="myControl.cab"              
                   classid="clsid:1ACA02DF-AF52-4371-89B9-B9245BD21831"
></OBJECT>
<script       language=javascript
                   FOR="myControl"
                   EVENT="event1()">   
                   OnEvent1();
</script>


2. 动态创建方法
function onBodyLoad()
{
        myControl = document.createElement("OBJECT");
        document.body.appendChild(myControl);
        myControl.codeBase = "myControl.cab";
        myControl.classid = "clsid:1ACA02DF-AF52-4371-89B9-B9245BD21831";
       
        myControl.attachEvent("event1", OnEvent1);
}

<body οnlοad="onBodyLoad()">
...

3. 错误的动态创建方法

function onBodyLoad()
 {
         myControl = new ActiveXObject(myControl.Test);
        myControl.attachEvent("event1", OnEvent1);
        ~~~~~~~~~~~~~~~~~~此时会报告“无此方法”,这是因为用new ActiveXObject创建的对象并非一个DOM对象,因此不能调用attachEvent方法。而用document.createElement("OBJECT")创建的才是一个DOM对象。
 }
 
<body οnlοad="onBodyLoad()">
...

 

4. 在COM组件中调用JavaScript函数
// 连接点方式页面javascript脚本
<object classid="CLSID:B568F111-DFE4-4944-B67F-0728AB2AB30F" id="testCom" VIEWASTEXT></object>
<script language="JavaScript" for="testCom" event="staTe(s)">
        alert("State(" + s + ")");
        return 123;
</script>
<script language="JavaScript">
        testCom.FireStateEvent("Hello");
</script>

// 事件属性方式页面javascript脚本
function onState(s){
        alert("onState(" + s + ")");
        return 456;
}
var o = new ActiveXObject("TestATL.TestCom");
o.onstaTe=onState;
o.FireStateEvent("Hello");

// Com组件VC7.1 ATL代码
__interface _ITestComEvents{
        [id(1), helpstring("State事件")] HRESULT State([in] BSTR str);
};
__event __interface _ITestComEvents;
IDispatchPtr m_onState;        // 事件属性
STDMETHOD(get_onState)(IDispatch** pVal) {
        *pVal = m_onState;
        return S_OK;
};
STDMETHOD(put_onState)(IDispatch* newVal) {
        m_onState = newVal;
        return S_OK;
};
STDMETHOD(FireStateEvent)(BSTR str) {
        __raise State(str);        // 激发连接点事件
        CComVariant result;
        CComVariant avarParams[1] = {str};
        DISPPARAMS dispParams = {avarParams, NULL, 1, 0};
        EXCEPINFO excepInfo;
        memset(&excepInfo, 0, sizeof excepInfo);
        UINT nArgErr = (UINT)-1;      // initialize to invalid arg
        if (m_onState)        // 激发属性事件
            HRESULT hr = m_onState->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT,
                DISPATCH_METHOD, &dispParams, &result, &excepInfo, &nArgErr);
        return S_OK;
}

文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/1_web/html/htmlshl/200855/114048.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值