为什么我用fireEvent触发button的onclick事件打开页面,没有效果呢?

meiyxq 2012-02-03 03:17:26
CComQIPtr<IHTMLDocument2> spDoc2;
CComQIPtr<IDispatch> spDoc2Disp;
spEle->get_document(&spDoc2Disp);
if(spDoc2Disp == NULL)
return 1;

spDoc2 = spDoc2Disp;

CComQIPtr<IHTMLDocument4> spDoc4 = spDoc2;
if(spDoc4 == NULL)
return 1;

CComPtr<IHTMLEventObj> spEvent;
CComVariant var;
spDoc4->createEventObject(&var, &spEvent);

CComQIPtr<IHTMLEventObj2> spEvent2(spEvent);
CComBSTR eventName = "onclick";
spEvent2->put_type(eventName);

CComQIPtr<IHTMLElement3, &IID_IHTMLElement3> spEle3(spEle);


VARIANT_BOOL varbResult;
CComVariant varEvent = spEvent;

hr = spEle3->fireEvent(eventName, &varEvent, &varbResult);
...全文
383 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishion 2012-02-03
  • 打赏
  • 举报
回复
CComQIPtr<IWebBrowser2> spBrowser = (IWebBrowser2 *)this->m_pBrowserApp;
if (spBrowser){
CComPtr< IDispatch > spDisp;
HRESULT hr = spBrowser->get_Document( &spDisp );
if ( FAILED ( hr ) ) return;

CComQIPtr< IHTMLDocument4 > spDoc4 = spDisp;
if ( spDoc4 )
{
VARIANT name;
VariantInit(&name);
//V_VT(&name) = VT_BSTR;
//V_BSTR(&name) = SysAllocString(L"days");
CComPtr<IHTMLEventObj> eventObj = NULL;
spDoc4->createEventObject( &name, &eventObj);

if(!eventObj) return;

//找到days控件
CComQIPtr <IHTMLDocument2> spHdoc2(spDisp);
if(!spHdoc2) return;
CComQIPtr <IHTMLElementCollection> spHec;
spHdoc2-> get_all(&spHec);
if(!spHec) return;
CComQIPtr <IDispatch> spDisp2;
spHec->tags(CComVariant("a"),&spDisp2);
if(!spDisp2) return;

CComQIPtr <IHTMLElementCollection> spHec1 = spDisp2;
spDisp2.Release();
if (spHec1 == NULL) return;
long len = 0;
spHec1->get_length(&len);
if (len == 0) return;
//遍历IHTMLElementCollection接口变量pElCol中的元素
CComPtr <IHTMLElement> pEl = NULL;
CComPtr <IDispatch> pDisp = NULL;
BSTR *bstrTagName;
for ( long i = 0; i < len; i++ )
{
CComVariant varName;
CComVariant varIndex;
pDisp.Release();
pEl.Release();
varIndex = (long) i;
spHec1->item(varIndex, varName, &pDisp);
if (pDisp == NULL) return ;
if ( FAILED(pDisp.QueryInterface(&pEl)) || (pEl == NULL) )
break;
pDisp.Release();
//在这里查看varName和varIndex的值,看看是否你需要的元素,
//如果是,使用pEI接口查询IHTMLTable
//pEl->get_tagName(bstrTagName);
//if(wcscmp((wchar_t *)bstrTagName,L"onclick"))
//{
//pEl->QueryInterface(IID_IHTMLTable, (void**)&pITable);
CComQIPtr <IHTMLElement3> spHe3(pEl);
if(!spHe3) return;
VARIANT_BOOL Caceled;
CComVariant vObj(eventObj);
spHe3-> fireEvent(L"onclick",&vObj,&Caceled);
//}
}
meiyxq 2012-02-03
  • 打赏
  • 举报
回复
已经制定元素了!以下代码也是一样!

在WebBrowser中自动点击链接,spElement->click()这种形式不能满足我的需求,但使用IHTMLElement3的fireEvent函数又不起作用,请高手指点一下,万分感谢!部分代码如下:

CComQIPtr<IHTMLElement3, &IID_IHTMLElement3>spElement3 = spElement;
CComQIPtr<IHTMLDocument4, &IID_IHTMLDocument4>spIHTMLDocument4 = spIHTMLDocument2;
CComPtr<IHTMLEventObj>spIHTMLEventObj;

VARIANT varEventObject;
VariantInit(&varEventObject);
hr = spIHTMLDocument4->createEventObject(&varEventObject, &spIHTMLEventObj);
//hr = spIHTMLDocument4->createEventObject(NULL, &spIHTMLEventObj);
CComQIPtr<IHTMLEventObj2, &IID_IHTMLEventObj2>spIHTMLEventObj2 = spIHTMLEventObj;
CComQIPtr<IDispatch, &IID_IDispatch>spEventDisp = spIHTMLEventObj2;

CComBSTR bstrEventName = "onclick";
VARIANT_BOOL vBool = VARIANT_FALSE;

VariantInit(&varEventObject);
V_VT(&varEventObject) = VT_DISPATCH;
V_DISPATCH(&varEventObject) = spEventDisp;

hr = spElement3->fireEvent(bstrEventName, &varEventObject, &vBool);

测试网页代码:
<html>
<title>test</title>
<head></head>
<body>
<a href="http://www.google.com" onclick="alert('ok');return true;">Google</a>
</body>
</html>

我要的效果是先出现ok对话框,然后导航到Google! 但是fireEvent仅仅出现对话框,不会导航到Google页面。请问哪个环节出问题了?
fishion 2012-02-03
  • 打赏
  • 举报
回复
你得指定是哪个元素,然后才能fireEvent
fishion 2012-02-03
  • 打赏
  • 举报
回复
但如果是用button来触发事件的话,应该就可以了
fishion 2012-02-03
  • 打赏
  • 举报
回复
这个问题以前也有人问过,不过后面都没怎么解决
http://www.cnblogs.com/birdshome/archive/2005/04/07/128182.html
可以看看这下面的评论,有说
meiyxq 2012-02-03
  • 打赏
  • 举报
回复
晕!不是吧!整了半天!我的意思就是为什么不能打开链接!..怎么才能fireevent click的时候才能打开链接!
fishion 2012-02-03
  • 打赏
  • 举报
回复
对这个研究不是很深入,一种方法是先得那个网址,再用Navigate2进行跳转
fishion 2012-02-03
  • 打赏
  • 举报
回复
。。哦,我忘记了,这个写法是不能导航到google这个链接上的。。
meiyxq 2012-02-03
  • 打赏
  • 举报
回复
你这样的写法能打开下面的gg的链接?
<html>
<title>test</title>
<head></head>
<body>
<a href="http://www.google.com" onclick="alert('ok');return true;">Google</a>
</body>
</html>

奇怪了!为什么我这边不行?alert触发不成问题,但是无法打开http://www.google.com这个链接!

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧