DOMContentLoaded никогда не вызывается в BHO (IE9)

Я хочу слушать DOMContentLoaded событие в BHO для Internet Explorer 9. Я прикрепил событие к IHTMLDocument3 в событии NavigateComplete2 без успеха (вложение идет нормально, но событие не срабатывает).

Я сделал нечто подобное для onload: я прикрепил событие «onload» к IHTMLWindow3, В этом случае работает нормально.

Я знаю, что DOM загружается не полностью, когда запускается NavigateComplete2, потому что я не могу получить доступ к ТЕЛО страницы в то время.

Как я могу захватить DOMContentLoaded в BHO?

1

Решение

Я не уверен почему 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 должен быть там и использоваться.

2

Другие решения

Других решений пока нет …