//这个item方法真是复杂啊。。头文件里声明是 name,index,idispath 第一个参数是名字啊,为什么是实际应用中会是整数呢?
小弟被这个问题困了很久了,请达人指点一二。
我已经得到了IHTMLDocument2指针,根据它里面的方法可以得到Body,可是我想得到DIV,并根据DIV的属性来阻止它的显示(目的是拦截浮动窗口)问题:
1.我不知道怎么得到DIV
2.得到DIV以后我应该怎么修改它的属性。
我用以下方法尝试但不行。
-
C/C++ code
- // pDoc为IHTMLDocument2的指针 CComPtr < IHTMLElementCollection > spAll; hr = pDoc -> get_all( & spAll); CComVariant varID = LPCOLESTR( " div " ); CComPtr < IDispatch > lpDisp; long nlen; spAll -> get_length( & nlen); CComPtr < IHTMLElement > item; for ( int i = 0 ; i < nlen; ++ i ) { hr = spAll -> item(varID, CComVariant(i), & lpDisp); if ( SUCCEEDED(hr) && lpDisp != NULL ) // 在这里lpDisp永远都是NULL { hr = lpDisp -> QueryInterface( /* IID_IHTMLElement, */ & item ); if ( SUCCEEDED(hr) && item != NULL ) { // 处理 } } }
请高手指点
---------回复--------------
用法错误,spAll->item的第一个参数一般用代表整数的索引,例如CComVariant((long)0),第二个参数可以随便设置,如果第一个参数用字符串,则不能用"div",这是标签名,字符串内容应该是id或者name属性值,比如 <div id='abc'>或者 <div name='abc'>。
你上面的代码既然是放到循环里了,则应该用数字索引来检索:
hr = spAll->item(CComVariant((long)i), CComVariant(), &lpDisp);
CComQIPtr <IHTMLElement> spElement = lpDisp;
CComBSTR tagName;
spElement->get_tagName(&tagName);
if (tagName == CComBSTR("DIV"))
{
// 现在如果需要更进一步定位,则按照需求来做,比如查看DIV的某个属性是否匹配,或者某个style属性是否匹配
}
如果div元素有ID或者NAME属性,那么定位方法不需要那么复杂,只需要调用
IHTMLDocument2::QueryInterface --> IHTMLDocument3
IHTMLDocument3::getElementById(L"someid", ...) --> IHTMLElement 在这里就能直接得到id='someid'的元素
---------回复--------------
varID应该是索引值或id属性或name属性值, 不是tag name
---------回复--------------
可是我在执行hr = spAll->item(varID, CComVariant(0), &lpDisp);这一句的时候有的时候会出错,有时就正常,错误提示是“iexplore.exe has triggered a breakpoint”
请问这又是怎么回事?
---------回复--------------
那肯定就是这句话引发的中断,你看下&lpDisp值是什么,是空?还是什么呢?检查一下!
---------回复--------------
出错的问题目解决,原因是没有调用它的Release()方法。每得到一个指针后不用的时候调用它的lpDisp.Release();就没问题了
---------回复--------------
CComPtr <IDispatch> lpDisp;
CComVariant varID(i);
hr = spAll->item(varID, CComVariant(0), &lpDisp);
CComPtr <IHTMLElement> item = lpDisp;
使用这种方法得到一个DIV的IHTMLElement以后,使用item->put_outerHTML(L"");方法,但是在网页里面“查看-》源码”里面,这个DIV还是存在,我用什么方法可以把这个DIV删除
---------回复--------------
查看网页源码查看的是原始下载的网页内容,不是动态改变的内容,无论DOM发生了什么改变,查看源码总是不变的,但是浏览器显示的内容是DOM改变后的