定位网页元素的问题!(请众多高手和大雨仔能多多指教啊)

roger_ding 2004-09-11 01:58:16
IHTMLDocument2::elementFromPoint,只能找到网页中最上层的元素
若网页中有两个(或以上)元素重叠,有办法能得到第一层下面的其他元素吗?当然point in element是前提!
...全文
277 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
roger_ding 2004-09-24
  • 打赏
  • 举报
回复
这个会比较的难,因为不知道分层是因为父元素还是因为父元素的父元素,还是就是自己本身,如果绝对定位的元素全部取消了,可能也不能完全解决问题

还在思考中……
蒋晟 2004-09-23
  • 打赏
  • 举报
回复
直接把绝对定位的元素全部hidden算了……
roger_ding 2004-09-23
  • 打赏
  • 举报
回复
这段代码是计算元素相对于左上角的坐标的,好像没太大作用……
gjd111686 2004-09-22
  • 打赏
  • 举报
回复
function GetDefineX(ObjectID)
{
var iPositionX=ObjectID.offsetLeft;
while(ObjectID=ObjectID.offsetParent)
{
iPositionX+=ObjectID.offsetLeft;
}
return iPositionX;
}
function GetDefineY(ObjectID)
{
var iPositionY=ObjectID.offsetTop;
while(ObjectID=ObjectID.offsetParent)
{
iPositionY+=ObjectID.offsetTop;
}
return iPositionY;
}
roger_ding 2004-09-18
  • 打赏
  • 举报
回复
实在还是找不出头绪,大家可以去新浪网新闻页面上随便打开个页面,在文本中间会有个flash,使用右键的“放大”“缩小”会发现没有用,原因是flash上层的div定义了zIndex,用一个空的flash遮住了下面的flash,
按 saucer(思归/MVP) ( ) 的方法:
设置flash的zIndex是无效的,如果去get parent element,这样就逻辑性太差了,不可行

大家还有好的方法吗?
fanqing 2004-09-17
  • 打赏
  • 举报
回复
up
roger_ding 2004-09-16
  • 打赏
  • 举报
回复
谢谢!
我看过了,
第一,这篇文档没有提到如果两个元素重叠怎么办?(根据文中的意思还是返回最上面的元素)
第二,这个只能得到IAccessible,这个interface和IHTMLElement能互转吗?
蒋晟 2004-09-16
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/workshop/browser/accessibility/elements/hittesting.asp
roger_ding 2004-09-15
  • 打赏
  • 举报
回复
但是这样需要做很多额外的处理,做不到很完美的elementFromPoint,而且如果有别的元素(例如两个iframe)发生重叠的话,就不是Set zIndex和get ParentElement那么简单了
roger_ding 2004-09-15
  • 打赏
  • 举报
回复
to 回复人: scxy(小熊) ( ) ???

你贴一个往form里元素赋值,并提交form的代码在这里是???
恕我眼拙,看不出你的意思!
scxy 2004-09-15
  • 打赏
  • 举报
回复
COleControl *pControl = reinterpret_cast<COleControl*>(GetParent());
IOleClientSite *pClientSite = pControl->GetClientSite();

if(NULL == pClientSite)
return -1;

try
{
CComPtr<IServiceProvider> pServiceProvider;

if(FAILED(pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&pServiceProvider))))
return -2;

CComPtr<IServiceProvider> pTopServiceProvider;

if(FAILED(pServiceProvider->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void**>(&pTopServiceProvider))))
return -3;

CComPtr<IWebBrowserApp> pWebBrowserApp;

if(FAILED(pTopServiceProvider->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void**>(&pWebBrowserApp))))
return -4;

CComPtr<IHTMLDocument2> pDocument;

if(FAILED(pWebBrowserApp->get_Document(reinterpret_cast<IDispatch**>(&pDocument))))
return -5;


CComPtr<IHTMLElementCollection> pElementCollection;

if(FAILED(pDocument->get_forms(reinterpret_cast<IHTMLElementCollection**>(&pElementCollection))))
return -6;

CComPtr<IDispatch> pDispatch;
_variant_t varName = WEB_FORM;
_variant_t varIndex = 0;

if(FAILED(pElementCollection->item(varName, varIndex, &pDispatch)))
return -7;

CComPtr<IHTMLFormElement> pForm;

pDispatch->QueryInterface(IID_IHTMLFormElement, reinterpret_cast<void**>(&pForm));

pDispatch.Release();

if(pForm == NULL)
return -8;

varName = WEB_HIDDEN;
if(FAILED(pForm->item(varName, varIndex, &pDispatch)))
return -9;

CComPtr<IHTMLInputElement> pHidden;

pDispatch->QueryInterface(IID_IHTMLInputElement, reinterpret_cast<void**>(&pHidden));

if(pHidden == NULL)
return -10;

pHidden->put_value(m_bCompleteSuccess ? L"true" : L"false");

pForm->submit();
}
catch(...)
{
}


return 0;
roger_ding 2004-09-14
  • 打赏
  • 举报
回复
好的,我试试先
saucer 2004-09-14
  • 打赏
  • 举报
回复
oh, boy, once you get TD, you should be using parentElement to get TR, TABLE...
roger_ding 2004-09-14
  • 打赏
  • 举报
回复
先谢谢 回复人: saucer(思归/MVP)

我用VC写了代码替代你上面的script,对于这个例子是可以的,因为div之间是平级的,但如果象下面这样的html:
<table border="0" cellpadding="1" cellspacing="0" width="100%" bgcolor="#f8dfb9" style="border-top:solid 1px #fffde7;">
<tr>
<td><b>来宾,欢迎您!</b></td>
<td align="right">[<a href="/pa/20">免费注册</a>]
</td>
</tr>
</table>
则会有问题,当把鼠标放在table的空白地带时,elementFromPoint返回td元素,当设置td的zIndex(按上面的方法时),下一次的elementFromPoint仍然返回td,
所以我猜可能是设置td的时候,tr和table(即它的父元素)都同时被设置了

所以大家还有什么好的方法?欢迎探讨指教!
saucer 2004-09-13
  • 打赏
  • 举报
回复
试试下面这个,在我机器上看不出来,也许是我眼睛不太好,看在你的机器上能看出
闪烁么?


<html>
<body>
<div id="d1" style="position:absolute;left:10px;top:10px;width:100px;height:100px;background-color:#ff0000;z-index:27">red red red red red red red red red red redred</div>
<div id="d2" style="position:absolute;left:10px;top:10px;width:100px;height:100px;background-color:#00ff00;z-index:10">green green green green green green green</div>
<div id="d3" style="position:absolute;left:10px;top:10px;width:100px;height:100px;background-color:#0000ff;z-index:25">blue blue blue blue blue blue blue blue blue blue</div>
<div id="d4" style="position:absolute;left:10px;top:10px;width:50px;height:100px;background-color:#00ffff;z-index:30">a aaaa aa aaa</div>
<div id="d5" style="position:absolute;left:60px;top:10px;width:50px;height:100px;background-color:#ff00ff;z-index:23">bbb bbbbb bbb bbbbbb</div>
</body>
</html>

<script type="text/javascript">
//only for IE
function document.onmouseover()
{
var e=window.event
var d=document;
var n=e.srcElement;
var el = n;
var elems= new Array();
do
{
elems.push(el);
el.style.zIndex = (el.style.zIndex||0)-1000;
el=d.elementFromPoint(e.x, e.y);
} while(el!=n);

elems.toString=function(){
var buf= new Array();
for(var ii=0; ii<this.length; ii++)
buf.push(this[ii].id);
return buf.join(", ");
}
// alert(elems);
window.status = elems;
for(var ii=0; ii<elems.length; ii++)
elems[ii].style.zIndex = elems[ii].style.zIndex + 1000;
}
</script>
roger_ding 2004-09-12
  • 打赏
  • 举报
回复
即使只有一次,假如我先把tr的z-index设小,就会出现tr里所有的元素都一起消失,然后我判断到table,即使我立即返回,重设tr的z-index,显然,IE会出现一次闪烁,这个恐怕不太好的
saucer 2004-09-12
  • 打赏
  • 举报
回复
你试过了么?你的目的是什么?你是在你编码里快速运算啊,用户移动光标的速度有多快?
fanqing 2004-09-12
  • 打赏
  • 举报
回复
up
roger_ding 2004-09-12
  • 打赏
  • 举报
回复
to saucer(思归/MVP):
谢谢你的回答,不过如果采用“然后把它的z-index变为很大的负数”,可以想象下,当鼠标滑过页面时,有的元素会先消失,然后又出现,关键是不停移,这种现象就会重复出现,所以可能会搞昏user的:)
roger_ding 2004-09-12
  • 打赏
  • 举报
回复
有个情况是属于最常见的,比如table元素包含了td、tr元素等,则elementFromPoint会返回td或tr元素,不会返回table,而且如果table有嵌套的话,如何得到root table将是个挑战
加载更多回复(3)

3,055

社区成员

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

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