我想在Internet Explorer 9的BHO中收听DOMContentLoaded事件。我已将该事件附加到NavigateComplete2事件中的IHTMLDocument3中,但没有成功(连接正常,但该事件不会触发)。

我对onload做了类似的事情:我将事件“onload”附加到了IHTMLWindow3上。在这种情况下,它可以正常工作。

我知道NavigateComplete2触发时DOM未完全加载,因为那时我无法访问页面的主体。

如何在BHO中捕获DOMContentLoaded

最佳答案

我不确定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应该存在并且可用。

关于c++ - 在BHO(IE9)中从未提出DOMContentLoaded,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13005039/

10-08 22:08