在DHTML中响应ActiveX控件的事件

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

1. 静态创建方法

                   codeBase="myControl.cab"              
                   classid="clsid:1ACA02DF-AF52-4371-89B9-B9245BD21831"
>

                   FOR="myControl"
                   EVENT="event1()">   
                   OnEvent1();


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);
}


...

3. 错误的动态创建方法

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

...

 

4. 在COM组件中调用JavaScript函数
// 连接点方式页面javascript脚本


// 事件属性方式页面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

你可能感兴趣的:(在DHTML中响应ActiveX控件的事件)