Я хочу слушать DOMContentLoaded
событие в BHO для Internet Explorer 9. Я прикрепил событие к IHTMLDocument3
в событии NavigateComplete2 без успеха (вложение идет нормально, но событие не срабатывает).
Я сделал нечто подобное для onload: я прикрепил событие «onload» к IHTMLWindow3
, В этом случае работает нормально.
Я знаю, что DOM загружается не полностью, когда запускается NavigateComplete2, потому что я не могу получить доступ к ТЕЛО страницы в то время.
Как я могу захватить DOMContentLoaded
в BHO?
Я не уверен почему 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 должен быть там и использоваться.
Других решений пока нет …