4

Web Performance API を使用する Web ベースのページ レンダリング ベンチマーク アプリを構築しています。基本的には、ブラウザーが一連の div 要素をレンダリングするように命令されたときにかかる時間を測定してから、非表示のフォームを作成し、計算結果をそこに入れ、フォームを処理のために別の PHP ページに送信します。問題は、計算結果が常に負になり、数兆の範囲 (つまり、14 桁の数字: -1364403484035) になることです。コードは次のとおりです。

window.onload=function(){
            results=(performance.timing.loadEventEnd-performance.timing.responseEnd);
            var browserData = document.createElement("form");
            browserData.setAttribute("method","post");
            browserData.setAttribute("action","results.php");

            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", "res");
            hiddenField.setAttribute("value", results);
            browserData.appendChild(hiddenField);

            document.body.appendChild(browserData);
            browserData.submit();`

更新 1:

次のように、コードを微調整しました。

 window.onload=function(){
        // My edits
        beginning=performance.timing.responseEnd;
        ending=performance.timing.loadEventEnd;
        results=(ending-beginning);
        // End of my edits
        var browserData = document.createElement("form");
        browserData.setAttribute("method","post");
        browserData.setAttribute("action","results.php");

        var hiddenField = document.createElement("input");
        hiddenField.setAttribute("type", "hidden");
        hiddenField.setAttribute("name", "res");
        hiddenField.setAttribute("value", results);
        browserData.appendChild(hiddenField);

        document.body.appendChild(browserData);
        browserData.submit();`

ブラウザの JavaScript コンソールを使用して変数の値を調べたところ、ending = 0

4

2 に答える 2

4

理由

これは、window.load が完了すると loadEventEnd が設定されるためです。load イベントで呼び出しています。

MSDN ドキュメントから:

loadEventEnd プロパティは、現在のドキュメントの読み込みイベントが完了した時刻を返す必要があります。load イベントが発生していないか、完了していない場合は、0 を返す必要があります。

直し方:

onload を終了できるように setTimeout を使用します。

window.onload = function () {
     window.setTimeout(function () {
         results = (performance.timing.loadEventEnd - performance.timing.responseEnd);
         var browserData = document.createElement("form");
         browserData.setAttribute("method", "post");
         browserData.setAttribute("action", "results.php");

         var hiddenField = document.createElement("input");
         hiddenField.setAttribute("type", "hidden");
         hiddenField.setAttribute("name", "res");
         hiddenField.setAttribute("value", results);
         browserData.appendChild(hiddenField);

         document.body.appendChild(browserData);
         browserData.submit();
     }, 0);
 }

別のオプションはloadEventEnd、ゼロでなくなるまでポーリングです。

于 2013-03-27T17:10:41.010 に答える
3

Boomerang を使用します ( https://github.com/lognormal/boomerang )。独自の Navigation Timing ライブラリを作成するには人生は短すぎます

于 2013-03-30T22:01:32.220 に答える