宁静以致远
zgf的blog
<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

留言簿(15)

随笔分类

随笔档案

文章档案

友情链接

资料收藏

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-29 文章-8 评论-93 Trackbacks-0

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

        一个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);
           

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

posted on 2006-03-01 18:47 zgf的blog 阅读(2748) 评论(5)  编辑 收藏
Comments
  • # re: 用vc将js响应函数绑定到网页元素的办法
    end
    Posted @ 2006-03-01 19:37
    方法一:
    用IHTMLWindow2::execScript,传入文本的script代码,比如
    execScript("hiddenObject.onclick = function(){alert("");}")

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

    如果响应函数实现用script方便,那么就用方法一,如果响应函数用c/c++实现方便就用方法二
  • # re: 用vc将js响应函数绑定到网页元素的办法
    zgf的blog
    Posted @ 2006-03-01 20:00
    现在不是执行而是绑定的问题呀。
    因为不知道什么时候会执行,而绑定后事件一产生就会自动执行
  • # re: 用vc将js响应函数绑定到网页元素的办法
    end
    Posted @ 2006-03-01 20:37
    就是绑定阿,仔细看看
    hiddenObject.onclick = function(){alert("");}

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

    http://msdn.microsoft.com/msdnmag/issues/0600/visualprog/default.aspx
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]