1

我想在 Internet Explorer 9 的 BHO 中收听该DOMContentLoaded事件。我已将事件附加到IHTMLDocument3NavigateComplete2 事件中,但未成功(附件正常,但事件未触发)。

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

我知道当 NavigateComplete2 触发时 DOM 没有完全加载,因为当时我无法访问页面的 BODY。

如何DOMContentLoaded在 BHO 中捕捉?

4

1 回答 1

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 应该在那里并且可用。

于 2012-10-22T07:52:56.997 回答