我正在使用此代码从IHTMLDocument2获取所有链接:
procedure DoDocumentComplete(const pDisp: IDispatch; var URL: OleVariant);
var
Document:IHTMLDocument2;
Body:IHTMLElement;
Links:IHTMLElementCollection;
i:integer;
tmp:IHTMLElement;
begin
try
Document := (pDisp as IWebbrowser2).Document AS IHTMLDocument2;
Body := Document.body;
Links := Document.links;
for i := 0 to (Links.length-1) do
begin
tmp := (Links.item(i, 0) as IHTMLElement);
//tmp.onclick := HOW SHOULD I ADD THE CALLBACK HERE?
//ShowMessage(tmp.innerText);
end;
except
on E : Exception do
ShowMessage(E.ClassName+' error raised, with message : '+E.Message);
end;
end;
如何在.onclick上添加一个函数/过程来执行一个简单的任务,例如在单击链接时显示带锚文本的警报?
答案 0 :(得分:4)
一种方法是使用实现IDispatch的对象从TWebBrowser中接收事件(如 http://groups.google.com/group/borland.public.delphi.oleautomation/msg/a57d99e0e52c78ce)
你要设置
tmp.onclick := TEventObject.Create(callbackProcedure) as IDispatch;
答案 1 :(得分:3)
我不建议直接使用onXXX处理程序(如onClick),因为这将替换任何先前附加的处理程序。这实际上可以改变/破坏页面的行为。如果您使用的是不受您控制的网页,最好使用 attachEvent :
(tmp as IHTMLElement2).attachEvent('onclick', callbackProcedureDisp);
不要忘记与 detachEvent 分开:
(tmp as IHTMLElement2).detachEvent('onclick', callbackProcedureDisp);
注意:可以多次附加相同的处理程序。在这种情况下,您的处理程序也会被多次调用。
如果您只对onclick感兴趣,可以在根元素中添加一个处理程序,而不必遍历所有元素。 MSDN表示事件气泡,因此您可以将一个事件处理程序附加到document元素,并在每次事件触发时检查IHTMLEventObj的srcElement成员。