Когда веб-страница считается «загруженной», в присутствии JS и т. Д. - PullRequest
0 голосов
/ 11 ноября 2010

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

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 11 ноября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...