Как добавить прослушиватель событий с помощью addEventListener MSHTML в IE9?
Документация MSDN для addEventListener
говорит, что принимает функцию обратного вызова в форме IDispatch *
объект. Из C# (я использую COM-взаимодействие), Visual Studio отображает тип параметра просто object
,
Я искал IEventListener
интерфейс или что-то подобное, но не нашел. Что я должен пройти?
1 ответ
После некоторых исследований я узнал, что эти точки подключения 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.