2009-12-02 4 views
1

J'utilise ce code pour obtenir tous les liens d'un IHTMLDocument2:Comment attacher un événement à des éléments de lien IHTMLDocument2 dans Delphi?

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; 

Comment une fonction/procédure pourrais-je joindre à .onclick à faire une tâche simple comme afficher une alerte avec le texte d'ancrage lorsque la le lien est cliqué?

Répondre

3

Je ne recommanderais pas à l'aide des gestionnaires onXXX (comme onClick) directement car cela remplacera tout handler précédemment attaché. Cela peut réellement changer/détruire le comportement de la page. Si vous travaillez avec une page Web qui ne sont pas sous votre contrôle, vous feriez mieux d'utiliser attachEvent:

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

Et ne pas oublier de se détacher avec detachEvent:

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

Attention: il est possible d'attacher plusieurs fois le même gestionnaire. Dans ce cas, votre gestionnaire serait également appelé plusieurs fois.

Si on ne s'intéresse qu'à onclick, vous pouvez simplement ajouter un gestionnaire à l'élément racine et ne pas avoir à parcourir tous les éléments. MSDN indique les bulles d'événement, vous pouvez donc simplement attacher un gestionnaire d'événements à l'élément document et vérifier le membre srcElement de IHTMLEventObj chaque fois que l'événement se déclenche.

+0

bonne réponse! probablement n'a pas encore reçu de upvotes car il était en retard .. –

Questions connexes