我无法获取Twebbrowser控件中加载的网页的所有元素ID。有人可以帮助我实现这个目标吗? 我想将元素ID保存在列表框或类似内容中,但这足以知道如何获取所有这些元素。
非常感谢!
答案 0 :(得分:2)
以下内容将扫描TWebBrowser的内容,并将其节点的ID属性放入TMemo中。
// Note : You need to add MSHTML to your Uses list if it's not there already
procedure TForm1.GetIDs;
var
All : IHTMLElementCollection;
Doc : IHtmlDocument2;
E : IHtmlElement;
i : Integer;
S : String;
begin
Doc := IDispatch(WebBrowser1.Document) as IHtmlDocument2;
Assert(Doc <> Nil);
All := IDispatch(Doc.all) as IHTMLElementCollection;
for i := 0 to All.Length - 1 do begin
E := IDispatch(All.Item(i, 0)) as IHtmlElement;
S :=IntToStr(i) + ' ' + E.id;
Memo2.Lines.Add(S);
end;
end;
这使用MSHTML.Pas中定义的DOM对象的接口。 MS的DOM对象有很多,你需要沉浸其中一段时间才能习惯它。请看这里的方式:
https://msdn.microsoft.com/en-us/library/aa703928%28v=vs.85%29.aspx#properties
正如您从我的(简单)简单示例中看到的那样,使用它往往需要在原始接口和OleVariants包装的接口之间进行大量跳转,如
All := IDispatch(Doc.all) as IHTMLElementCollection;
顺便说一下,上面的代码使用&#34;早期绑定&#34;到MSHTML.Pas中定义的接口对象。您将看到的许多用于处理这些对象的示例代码使用OleVariants(即&#34;后期绑定&#34; - 如果您不确定早期和晚期绑定之间的区别,请参阅OLH)。以下是上述代码的后期版本。
procedure TForm1.GetIDs2;
var
All,
Doc,
E : OleVariant;
i : Integer;
S : String;
begin
Doc := WebBrowser1.Document;
All := Doc.all;
for i := 0 to All.Length - 1 do begin
E := All.Item(i);
S :=IntToStr(i) + ' ' + E.id;
Memo2.Lines.Add(S);
end;
end;
通常,后期绑定更容易用于实验和最初工作,因为它允许省略可选参数,并且不要求您使用类型化接口变量。缺点是IDE在后期绑定接口上没有代码完成,执行速度较慢。
示例HTML:
<html>
<body>
<div ID="adiv" style="TEXT-ALIGN: left; color: Gray">Some text
<div ID="asubdiv" style="TEXT-ALIGN: left; color: Gray">Subdiv</div>
</div>
<div style="TEXT-ALIGN: left; color: Gray">Some more text</div>
<div ID="cdiv" style="TEXT-ALIGN: left; color: Gray">Some even more text</div>
</body>
</html>