addEventListener
的 MSDN 文档表示它接受 IDispatch *
对象形式的回调函数。在 C# 中(我使用的是 COM 互操作),Visual Studio 将参数类型显示为 object
。
我在寻找 IEventListener
接口(interface)或类似的东西,但没有找到。我应该传递什么?
最佳答案
经过一些研究,我了解到这些 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)]
注释的方法。 .
尽管如此,避免使用 W3C DOM 事件 API 的解决方案可能更合适,因为当浏览器使用较低文档模式实现兼容性时,IE9 DOM 对象不支持此方法。例如,使用 addEventListener
的扩展将在像 Bing 这样以 IE7 模式呈现的页面上失败。
似乎也无法设置 IWebBrowser2
使用的文档模式除了通过 F12 开发人员工具手动执行此操作之外的实例。
关于c# - 如何在 IE9 中使用 MSHTML 的 addEventListener 添加事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4999247/