7

この質問からのコメントは、私に何かを考えさせました。$(document).ready()関数が起動するのはいつですか?明白な答えは「ドキュメントの準備ができたとき」ですが、正確にはいつですか?

たとえば、出力バッファリングをオンにして、PHP の実行中に出力をフラッシュした場合、ブラウザに出力が送信されませんか? では、PHP スクリプトの実行が完了する前にドキュメントの準備を整える方法はありますか?それとも、リクエストが完了するまでイベントを待機させることはできますか?


編集:

応答は、クライアントが準備ができたと考えたときにイベントが発生することに基本的に同意しているようです。

理解を深めるために (おそらく最初にこれを行うべきでした)、テストをセットアップしました。

<?php ob_start(); ?>
<html>
<head>
    <script type="text/javascript" src="lib/js/jquery-1.7.1.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            alert("READY");
        });
    </script>
</head>
<body>
<?php
    ob_flush();
    for ($i=0; $i<999999; $i++) {
        echo "HELLO$i\n";
        ob_flush();
    }
?>
</body>
</html>

その結果、この例ではコンテンツがすぐにページに表示され始めましたが、ループが完了するか、スクリプトがタイムアウト (30 秒) するまでアラートは発生しませんでした。

使用するブラウザーに応じて、これをループに挿入してみました。

if ($i == 99) {
    echo "</body></html>";
}

また、Chrome はこれらのタグをページの最後に配置することで、自動的に修正したようです (Web 開発インスペクターで見られるように)。ページのソースを表示すると、途中で表示されましたが、エコーしました。

4

5 に答える 5

3

たとえば、PHP の実行中に出力バッファリングをオンにして出力をフラッシュした場合、出力はブラウザに送信されませんか?

はい、出力を送信しますが、ブラウザーがサーバーが終了したと見なすわけではありません。PHP ではないことはわかっていますが、Perl の記事Suffering from Bufferingが大好きです。UserAgent が準備ができたと判断した時点で、ドキュメントは準備完了です。ただし、ブラウザは、まだデータを受信中であり、END シグナルが送信されていないと認識している間、ソケットを開いたままにします。

では、PHP スクリプトの実行が完了する前にドキュメントの準備を整える方法はありますか?それとも、リクエストが完了するまでイベントを待機させるのでしょうか?

通常、ブラウザはサーバーがデータの送信を完了するまで待機します。出力をフラッシュしている場合、スクリプトがまだ実行されている間に Web サーバーがタイムアウトする可能性があります。たとえば、Apache のデフォルトは 2 分だと思います。サーバーが終了シグナルを送信すると、ドキュメントは終了し、スクリプトがまだサーバー上で実行されている場合でも、ブラウザーは DOM を準備して DOMReady イベントを発生させる可能性があります。


</body>他のいくつかのコメントとは対照的に</html>、主にページの形式が正しくない可能性があるため (スペルミスがあるか、それらの終了タグが含まれていない)、DOM の準備ができていることを示す良い指標ではありません。そのような場合でも、ブラウザーは引き続き Quirksmode でレンダリングし、DOMReady を起動します。

于 2013-07-08T18:22:26.930 に答える
0

Document.ready()DOM の読み込みが完了すると発生します。すべての HTML が存在する場合、DOMreadyイベントが発生します。

PHPはサーバー側のコーディング言語であるため、PHP がDOMに干渉することはありません。readyサーバーから処理され、サーバーが要求されたページを送信し、ブラウザがページをロードして DOMreadyイベントが発生します。

readyDOMとウィンドウの違いは、すべての画像/css が読み込まれるloadまで load が待機することです。タグは HTML に存在しますが、画像は表示されません。

</html>基本的に、ブラウザーが HTML 終了タグ ( )を読み取ると、DOM Ready が起動されると言えます。

于 2013-07-08T18:11:13.870 に答える