2009-09-12 5 views
3

J'ai travaillé sur une BHO/barre d'outils écrite en C# qui écoute les événements HTML générés sur la page Web actuelle du navigateur. La solution inclut une classe réutilisable appelée HtmlPageEventManager dont l'objectif est de s'abonner à une liste donnée d'événements HTML pour chaque nouvelle page Web ouverte. Un objectif consiste à attacher des gestionnaires dès que l'utilisateur peut commencer à interagir avec des éléments de page, avant même que le chargement de la page ne soit terminé. L'utilisation de cette classe est simple - il suffit d'appeler le constructeur:Écouter des événements HTML de BHO

var evts = new List() { 
    HtmlEvent.onclick, HtmlEvent.ondblclick, HtmlEvent.onkeydown, 
    HtmlEvent.onselectstart, HtmlEvent.onselectionchange, 
    HtmlEvent.onfocus, HtmlEvent.onselect 
}; 
new HtmlPageEventManager(this, evts, this.HtmlEventHandler);

S'il vous plaît download my solution here pour l'essayer et envoyez-moi des commentaires. N'hésitez pas à l'utiliser dans vos propres projets si vous le trouvez utile. Bien que cela fonctionne bien, il y a des occasions où il n'arrive pas à attacher les événements. J'ai eu de la difficulté à identifier ces circonstances. Donc je pourrais utiliser de l'aide pour améliorer HtmlPageEventManager.

Ma solution fait référence aux assemblages SpicIE mais ils ne sont pas inclus dans le téléchargement ci-dessus. Vous devrez donc l'obtenir auprès de the SpicIE website. Btw, c'est probablement le bon moment pour demander: quelle est la popularité de SpicIE? Un meilleur outil à utiliser?

+0

J'ai trouvé un cas reproductible où HtmlPageEventManager ne parvient pas à attacher les événements. Lorsque vous ouvrez une page Web, cela fonctionne correctement dans 95% des cas. Toutefois, lorsque vous "actualisez" cette page, les enregistrements d'événements sont perdus. Marcher à travers le débogueur, tout a l'air comme prévu. Une recherche Google (http://www.google.com/search?q=IWebBrowser2+detect+refresh) révèle qu'il s'agit d'un problème courant. Il ne semble pas que j'aurai le temps de poursuivre seul. Alors s'il vous plaît poster ici et/ou contactez-moi si vous êtes intéressé à aider à améliorer HtmlPageEventManager de cette façon. – HappyNomad

Répondre

2

Ouais! J'ai surmonté le problème "Actualiser" en m'abonnant à l'événement DownloadComplete du BHO, où j'appelle à nouveau ma méthode d'assistance "RegisterEventHandlers" qui attache les gestionnaires d'événements HTML. Le code jeffamaphone lié à était utile. J'ai incorporé son idée d'une variable membre "normalPageLoad" pour appeler conditionnellement RegisterEventHandlers. J'ai également regardé the accompanying forum post. Cependant, je ne peux pas comprendre l'accent mis sur l'événement Loaded de la fenêtre parente. J'ai eu mon code de travail sans même faire cette partie. Quoi qu'il en soit, je pense que HtmlPageEventManager est entièrement fonctionnel maintenant - frapper sur le bois. S'il vous plaît, donnez-moi un cri si vous trouvez un cas dans lequel il ne fait toujours pas son travail.

0

Vous allez trouver qu'il n'y a pas de solution 100% pour faire cela pour IE pendant le chargement de la page. Ce n'est pas votre faute: le modèle événementiel d'IE est une masse spaghetti géante de code asynchrone qui rend très difficile le bon fonctionnement. Si vous avez une solution à 95%, je dis être heureux et passer à autre chose.

+0

Si vous regardez HtmlPageEventManager, vous verrez que je suis venu assez loin avec une solution flexible qui correspond à la masse de spaghetti géant. L'idée est de ranger les détails dans ce composant réutilisable afin que d'autres puissent en bénéficier. Tu as raison de dire que j'ai vraiment besoin de passer à autre chose. C'est pourquoi j'espère trouver quelqu'un qui m'aidera à l'améliorer. Le problème est maintenant que chaque fois que l'utilisateur actualise la page Web, les événements cessent d'être gérés et mon plug-in cesse de fonctionner. – HappyNomad

+0

Ouais, essayer de gérer l'événement Refresh dans IE est un buzz total. Vous pouvez regarder ce que John Lister a fait dans son truc DemoButton. http://code.google.com/p/pricegoblin/wiki/DemoButton –

Questions connexes