1

このコードを使用して、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 に添付するにはどうすればよいですか?

4

2 に答える 2

4

onXXX-handlers (onClick など) を直接使用することはお勧めしません。これは、以前にアタッチされたハンドラーを置き換えるためです。これにより、実際にページの動作が変更/破壊される可能性があります。自分の管理下にない Web ページで作業している場合は、attachEventを使用することをお勧めします。

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

detachEventでデタッチすることを忘れないでください:

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

注意: 同じハンドラを複数回アタッチすることができます。この場合、ハンドラも複数回呼び出されます。

onclick のみに関心がある場合は、ルート要素にハンドラーを 1 つ追加するだけで、すべての要素を移動する必要はありません。MSDNはイベント バブルについて述べているため、1 つのイベント ハンドラーをドキュメント要素にアタッチするだけで、イベントが発生するたびに IHTMLEventObj の srcElement メンバーを確認できます。

于 2010-03-29T19:08:34.737 に答える
4

1 つの方法は、IDispatch を実装するオブジェクトを使用して TWebBrowser からイベントをシンクすることです (http://groups.google.com/group/borland.public.delphi.oleautomation/msg/a57d99e0e52c78ce )

あなたが設定します

tmp.onclick := TEventObject.Create(callbackProcedure) as IDispatch;
于 2009-12-02T04:04:14.350 に答える