Pergunta

Eu estou usando este código para obter todos os links de um 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;

Como eu poderia anexar uma função / procedimento para .onclick para fazer uma tarefa simples como mostrar um alerta com o texto âncora quando o link é clicado?

Foi útil?

Solução

Uma maneira é afundar eventos do TWebBrowser com um objeto que implementa IDispatch (como http: // groups.google.com/group/borland.public.delphi.oleautomation/msg/a57d99e0e52c78ce )

você deve definir

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

Outras dicas

Eu não recomendaria usar os onxxx-manipuladores (como onClick) diretamente como este irá substituir qualquer manipulador previouly anexado. Isso pode realmente mudar / destruir o comportamento da página. Se você estiver trabalhando com uma página web que não está sob seu controle é melhor uso attachEvent :

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

E não se esqueça de separar com detachEvent :

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

Atenção: é possível anexar o mesmo manipulador várias vezes. Neste caso, o manipulador também ser chamado várias vezes.

Se você está interessado apenas em onclick você poderia apenas adicionar um manipulador para o elemento raiz e não têm de viajar através de todos os elementos. MSDN afirma que as bolhas de eventos, para que poderia simplesmente anexar um manipulador de eventos para o elemento do documento e verifique o membro srcElement do IHTMLEventObj cada vez que o evento é acionado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top