Когда веб-страница считается "загруженной", в присутствии JS и т. Д.

Информация: я не знаю javascript. никто.

Мне интересно, есть ли способ определить, когда веб-страница полностью загружена? Допустим, у меня есть сканер, который использует webkit для рендеринга страниц (и JS-движок webkit для синтаксического анализа любых функций JS и завершения обработки DOM и т. Д.). Мне интересно, есть ли способ узнать, когда веб-страница "загружена"? Что я считаю выполненным:

1) Все сценарии завершены. 2) Нет ожидающих вызовов AJAX. 3) DOM полностью обрабатывается и загружается на основе доступной в настоящее время информации.

Для более конкретной гипотезы, глядя на источник нескольких сайтов, я вижу, что они загружают рекламу с помощью тега сценария, который вводит материал в DOM и выдает вызовы AJAX для загрузки и заполнения объявлений. Как определить, когда все это сделано?

(Думаю, замените пример чем-нибудь асинхронным. Я просто не мог придумать ничего более универсального, чем выше.)

Под "обнаружением" я подразумеваю любым возможным способом. Например, добавление небольшого количества кода JS на страницу, которая записывает что-то на страницу, чтобы сообщить мне, что все готово. Или, например, с помощью QtWebkit, JS может вызывать C++(я полагаю), поэтому фрагмент JS может вызывать функцию C++, чтобы сообщить, когда страница была "загружена". Что бы ни работало, короче говоря.

Текущая "наивная" реализация, которая у меня есть, просто сидит и ждет несколько секунд после загрузки страницы. Это глупо.

Пожалуйста, будьте настолько подробны, насколько это возможно, и не стесняйтесь говорить "сначала прочтите это", если требуется дополнительная справочная информация, прежде чем я пойму ответ.

Большое спасибо!

1 ответ

В целом невозможно сказать, действительно ли страница, содержащая асинхронный контент, управляемый сценарием, действительно загружена. Помимо фундаментальной проблемы остановки, скрипты или плагины могут регистрироваться для периодических событий таймера и продолжать модифицировать или добавлять на страницу неограниченное время.

Подход, который я обычно применяю для определения того, когда страница загружается, заключается в том, когда загружен весь DOM, загружены ресурсы (изображения, таблицы стилей, сценарии и т. Д.), На которые имеются ссылки непосредственно из этого DOM, и весь код сценария был загружен. прочитать и выполнить через один раз. Текст отправляется через document.write() обрабатывается для этой цели, как если бы он был непосредственно включен в исходный HTML. Если вы используете QtWebKit, я считаю, что такое поведение вы увидите, если подключитесь к сигналу. QWebPage::loadFinished(bool), (Вы можете получить содержимое QWebPage из QWebFrameиспользуя аксессор page().)

Отложенные действия, заданные кодом сценария, будь то таймеры, события, ожидающие завершения загрузки других ресурсов, или что у вас есть, не учитываются; Медиаплееры и другие плагины могут усложнять ситуацию, потому что у каждого типа мультимедиа или даже плеера может быть свой стандарт того, что является "загруженным".

Ряд недавних библиотек JavaScript используют это поведение для улучшения воспринимаемого времени загрузки страницы, загружая неполную страницу, содержащую только содержимое первого экрана плюс некоторый сценарий, и фактически не начинает загружать изображения и контент "ниже сгиба" до тех пор, пока не произойдет первая Скриншот или около того делается загрузка и рендеринг. Это не очень удобно для автоматизированных инструментов, сканеров или тех, кто считает JavaScript привилегией, которую можно получить на надежных сайтах.

Другие вопросы по тегам