0

情報: JavaScript の知識がありません。なし。

Web ページが完全にロードされたことを判断する方法があるかどうか知りたいです。Webkit を使用してページをレンダリングする (および Webkit の JS エンジンを使用して JS 関数を解析し、DOM などの処理を終了する) クローラーがあるとします。私が行うと考えていること:

1) すべてのスクリプトの実行が終了しました。2) 保留中の AJAX 呼び出しはありません。3) DOM は、現在入手可能な情報に基づいて完全に処理およびロードされます。

より具体的な仮説として、いくつかのサイトのソースを見ると、DOM に何かを挿入するスクリプト タグを使用して広告を読み込み、AJAX 呼び出しを発行して広告を読み込み、入力することがわかります。これらすべてがいつ完了したかをどのように判断できますか?

(例を非同期のものに置き換えてください。上記よりも普遍的なものは考えられませんでした。)

「検出」とは、可能な限りあらゆる方法で行います。たとえば、何かが完了したことを知らせるためにページに何かを書き込む JS コードをページに挿入します。または、たとえば QtWebkit を使用すると、JS は C++ を呼び出すことができるので (私は信じています)、JS スニペットは C++ 関数を呼び出して、ページがいつ「読み込まれた」かを知らせることができます。要するに、機能するものは何でも。

私が持っている現在の「素朴な」実装は、ページをロードした後、座って数秒間待機します。それは愚かです。

回答を理解する前にさらに背景情報が必要な場合は、「これを最初に読んでください」と気軽に言ってください。

どうもありがとうございました!

4

1 に答える 1

1

一般に、非同期のスクリプト駆動型コンテンツを含むページの読み込みが本当に完了したかどうかを判断することは不可能です。停止問題という基本的な問題は別として、スクリプトまたはプラグインが定期的なタイマー イベントに登録し、無期限にページの変更または追加を続ける可能性があります。

ページの読み込みがいつ完了したかを判断するために私が通常見たアプローチは、DOM 全体が読み込まれ、その DOM から直接参照されるリソース (画像、スタイルシート、スクリプトなど) が読み込まれ、すべてのスクリプト コードが読み込まれたときです。読み取りと実行を 1 回実行します。経由で出力されたテキストdocument.write()は、ソース HTML に直接含まれているかのようにこの目的のために扱われます。QtWebKit を使用している場合、シグナルに接続すると、これが表示される動作になると思いますQWebPage::loadFinished(bool)。(アクセサを使用して、含まれているを取得できQWebPageます。)QWebFramepage()

スクリプト コードによって設定された遅延アクションは、タイマー、他のリソースのロードが完了するのを待っているイベント、または何によって行われたかを問わず、カウントされません。メディア プレーヤーやその他のプラグインは、メディアの種類ごと、またはプレーヤーでさえ、「ロード済み」を構成する基準が異なる場合があるため、事態をさらに複雑にする可能性があります。

最近の JavaScript ライブラリの多くは、この動作を悪用して、最初の画面分のコンテンツといくつかのスクリプトだけを含む不完全なページを読み込み、最初の画面が表示されるまで「スクロールせずに見える範囲」で実際に画像やコンテンツの読み込みを開始しないことで、認識されるページの読み込み時間を改善しています。画面一杯程度の読み込みとレンダリングが行われます。ただし、自動化されたツール、クローラー、または JavaScript を信頼できるサイトが得られる特権と考える人にとっては、あまり友好的ではありません.

于 2010-11-11T08:19:27.157 に答える