Как добавить прослушиватель событий с помощью addEventListener MSHTML в IE9? - PullRequest
5 голосов
/ 15 февраля 2011

В документации MSDN для addEventListener говорится, что она принимает функцию обратного вызова в виде объекта IDispatch *. В C # (я использую COM-взаимодействие) Visual Studio отображает тип параметра как object.

Я искал интерфейс IEventListener или что-то подобное, но не нашел. Что я должен передать?

1 Ответ

5 голосов
/ 16 февраля 2011

После некоторых исследований я узнал, что эти точки подключения COM (обработчики событий) указаны с помощью DispId(0). Функции обратного вызова представлены экземплярами классов, такими как:

// These attributes may be optional, depending on the project configuration.
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class EventListener
{
    [DispId(0)]
    // The "target" parameter is an implementation detail.
    public void NameDoesNotMatter(object target, IDOMEvent evt) { ... }
}

Поскольку DispId(0) определяет метод по умолчанию для вызова, фактическое имя метода не имеет значения. Однако параметры метода, безусловно, имеют значение. Например, IHTMLElement.onclick должен быть присвоен обратный вызов без аргументов, а IHTMLElement2.attachEvent принимает обратный вызов с одним параметром типа IHTMLEventObj (или IHTMLEventObj2, ..., 6 или даже просто object ).

В итоге, обратные вызовы COM IDispatch могут быть реализованы в C # с использованием видимого COM-класса с методом, который принимает правильные аргументы и помечается [DispId(0)].


Несмотря на все это, решения, которые не используют API событий DOM W3C, могут быть более подходящими, поскольку объекты IE9 DOM не поддерживают этот метод, когда браузер использует режим совместимости с более низким режимом документов. Например, расширение, использующее addEventListener, не будет работать на странице типа Bing, которая отображается в режиме IE7.

Также представляется невозможным установить режим документа, используемый экземпляром IWebBrowser2, кроме ручного выполнения этого с помощью инструментов разработчика F12.

...