我想在BHO中听取Internet Explorer 9中的DOMContentLoaded
事件。我已将事件附加到NavigateComplete2事件中的IHTMLDocument3
但没有成功(附件很好,但是事件不会触发)。
我为onload做了类似的事情:我已将事件“onload”附加到IHTMLWindow3
。在这种情况下它可以正常工作。
我知道当NavigateComplete2触发时DOM没有完全加载,因为那时我无法访问页面的BODY。
如何在BHO中捕获DOMContentLoaded
?
答案 0 :(得分:2)
我不确定为什么DOMContentLoaded
没有开火。最合乎逻辑的解释是,当你处理NavigateComplete2
时它已经被解雇了,尽管在这种情况下你无法访问整个DOM有点奇怪。处理程序中文档的readyState
是什么?
无论如何,更好的解决方案可能是为OnReadyStateChange
注册一个接收器,如下所示:
class CDocumentSink :
public IDispEventImpl<1, CDocumentSink, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 4, 0>
{
public:
BEGIN_SINK_MAP(CDocumentSink)
SINK_ENTRY_EX(1, DIID_HTMLDocumentEvents2, DISPID_READYSTATECHANGE, OnReadyStateChange)
END_SINK_MAP()
STDMETHOD_(void, OnReadyStateChange)(IHTMLEventObj* ev);
};
您可以将其作为现有的一部分来实现,也可以创建一个单独的类(如上例所示)。当readyState
为4(完成)时,DOM应该在那里并且可用。