ActiveX控件可以用连接点创建事件,此事件可以在DHTML网页中被javascript函数处理,在js中响应ActiveX控件事件的方法如下:
1. 静态创建方法
function 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