簡體   English   中英

如何在Delphi中將事件附加到IHTMLDocument2鏈接元素?

[英]How to attach an event to IHTMLDocument2 link elements in Delphi?

我正在使用以下代碼從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以執行簡單的任務,如顯示帶有錨文本的警報?

一種方法是使用實​​現IDispatch的對象從TWebBrowser接收事件(例如 http://groups.google.com/group/borland.public.delphi.oleautomation/msg/a57d99e0e52c78ce

你會設定

tmp.onclick := TEventObject.Create(callbackProcedure) as IDispatch;

我不建議直接使用onXXX-handlers(如onClick),因為這將替換任何以前附加的處理程序。 這實際上可以更改/破壞頁面的行為。 如果您使用的網頁不受您的控制,則最好使用attachEvent

(tmp as IHTMLElement2).attachEvent('onclick', callbackProcedureDisp);

並且不要忘記使用detachEvent進行分離:

(tmp as IHTMLElement2).detachEvent('onclick', callbackProcedureDisp);

注意:可以多次附加同一處理程序。 在這種情況下,您的處理程序也會被多次調用。

如果您只對onclick感興趣,則可以向根元素添加一個處理程序,而不必遍歷所有元素。 MSDN聲明了事件氣泡,因此您只需在事件觸發時將一個事件處理程序附加到document元素並檢查IHTMLEventObj的srcElement成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM