如何在IE9中使用MSHTML的addEventListener添加事件监听器?
addEventListener
的MSDN文档说它接受IDispatch *
对象forms的回调函数。 从C#(我正在使用COM互操作),Visual Studio将参数类型显示为object
。
我找了一个IEventListener
接口或类似的东西,但没有找到一个。 我应该传递什么?
经过一些研究,我了解到这些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
类型的一个参数(或IHTMLEventObj2
,…, 6
,甚至只是object
)进行回调。
总之,COM IDispatch
回调可以使用COM-visible类在C#中实现,该类具有接受正确参数的方法,并使用[DispId(0)]
批注。
尽管如此,避免使用W3C DOM Events API的解决方案可能更合适,因为当浏览器使用较低文档模式以实现兼容性时,IE9 DOM对象不支持此方法。 例如,使用addEventListener
的扩展将在Bing等页面上失败,该页面以IE7模式呈现。
除了通过F12开发人员工具手动执行此操作外,似乎也无法设置IWebBrowser2
实例使用的文档模式。