分享

用vc将js响应函数绑定到网页元素的办法

 行走在理想边缘 2018-12-04

        唉,为了这个小问题搞了两个星期,郁闷到了极点。

        一个html网页,已经显示了一些内容。网页上已经用javascript写好了网页元素的各种响应函数。现在我需要根据内容的不同小范围的修改网页,利用IHTMLDocument2接口 vc可以很容易的添加各种网页元素并设置它们的值。但是在设置它们的响应函数时碰到困难了。

以设置Onclick为例,HRESULT IHTMLElement::put_onclick(VARIANT v)和HRESULT attachEvent( BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult)都可以设置响应函数。但必须找到响应函数的IDispatch 。

msdn上有

HRESULT IHTMLDocument::get_Script(IDispatch **p);

可以获得script的IDispatch,再往下就只能用IDispatch的Invoke()来执行script中的函数。达不到目的。网上找了些相关的例子,都是采用的方法子类化IDispatch的方法。如下:
pClickEvent = new CClickEvent ;    //CClickEvent是自己实现的IDispatch子类
VARIANT vDocDisp;
vDocDisp.vt = VT_DISPATCH;
vDocDisp.pdispVal = pClickEvent ;
pDoc2->put_onclick( vDocDisp);

将自己写的响应函数体写入重载Invoke()函数就行了。
但这种方法的函数体实现是在vc中实现的,也与目标不符。

无数次的查看msdn,突然发现put_onclick的反面不是get_onclick么。
于是我在网页的开头添加了一个hidden元素
<input type=hidden id="substr" name="hiddenObject" value="" onclick="clickhand()">
想到了吧,获取了hidden元素onclick响应函数不就是得到了其它网页元素的onclick响应函数了吗。下面是我的代码:
 if (m_pBrowser->get_Document( &spDispatch) != S_OK)
     return;
  spDispatch->QueryInterface(IID_IHTMLDocument3,(void**)&pDoc3);

 VARIANT vOnclick;
 BSTR bstrid = ::SysAllocString(L"substr");
 pDoc3->getElementById(bstrid,&pElement);

 pElement->get_onclick(&vOnclick);

 这样就获取了onclick的响应函数。
之后就简单啦,假设添加的网页元素是pAddElement,设置它的onclick响应函数只需 pAddElement->put_onclick(vOnclick);
           

不管怎样总算可以交差啦。显然这种方法很无奈,我将它写下来,希望各位路过的人能有更好的办法。


评论列表
end2014/4/7 15:43:46
re: 用vc将js响应函数绑定到网页元素的办法
方法一:
用IHTMLWindow2::execScript,传入文本的script代码,比如
execScript("hiddenObject.onclick = function(){alert("");}")

方法二:
文中已有描述,就是实现IDispatch接口的对象

如果响应函数实现用script方便,那么就用方法一,如果响应函数用c/c++实现方便就用方法二
zgf的blog2014/4/7 15:43:46
re: 用vc将js响应函数绑定到网页元素的办法
现在不是执行而是绑定的问题呀。
因为不知道什么时候会执行,而绑定后事件一产生就会自动执行
end2014/4/7 15:43:46
re: 用vc将js响应函数绑定到网页元素的办法
就是绑定阿,仔细看看
hiddenObject.onclick = function(){alert("");}

执行这个赋值操作就是将hiddenObject这个元素(当然可以是任意页面元素)的onclick事件定义为匿名函数function(){alert("");},用execScript执行这段script又不会去执行alert(""),而要等到那个元素被click的时候才会
zgf的blog2014/4/7 15:43:46
re: 用vc将js响应函数绑定到网页元素的办法
呵呵,早知道就不用郁闷两星期啦
myy2014/4/7 15:43:46
re: 用vc将js响应函数绑定到网页元素的办法
这样试试看:(没实验过,不知道行不行)
------------------
获得script的IDispatch后,用IDispatch反查IActiveScript,调用IActiveScript::GetScriptDispatch(...)查询js函数的IDispatch...

http://msdn.microsoft.com/msdnmag/issues/0600/visualprog/default.aspx

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多