【问题标题】:How to attach an event to IHTMLDocument2 link elements in Delphi?如何在 Delphi 中将事件附加到 IHTMLDocument2 链接元素?
【发布时间】:2009-12-02 02:26:24
【问题描述】:

我正在使用此代码从 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 以执行简单的任务,例如在单击链接时显示带有锚文本的警报?

【问题讨论】:

    标签: delphi events onclick iwebbrowser2 ihtmldocument2


    【解决方案1】:

    一种方法是使用实​​现 IDispatch 的对象从 TWebBrowser 接收事件(如 http://groups.google.com/group/borland.public.delphi.oleautomation/msg/a57d99e0e52c78ce

    你会设置

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

    【讨论】:

    • 谢谢,这看起来很有用。我会试试看。
    【解决方案2】:

    我不建议直接使用 onXXX 处理程序(如 onClick),因为这将替换任何以前附加的处理程序。这实际上可以改变/破坏页面的行为。如果您正在使用不受您控制的网页,则最好使用 attachEvent

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

    别忘了使用 detachEvent 进行分离:

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

    注意:可以多次附加同一个处理程序。在这种情况下,您的处理程序也会被多次调用。

    如果您只对 onclick 感兴趣,您可以只向根元素添加一个处理程序,而不必遍历所有元素。 MSDN 表示事件冒泡,因此您只需将一个事件处理程序附加到文档元素并在每次事件触发时检查 IHTMLEventObj 的 srcElement 成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 2019-02-19
      相关资源
      最近更新 更多