4

我正在构建一个使用 Web Performance API 的基于 Web 的页面渲染基准应用程序。它所做的基本上是测量浏览器在命令渲染一堆 div 元素时需要多少时间,然后构建一个隐藏的表单,将计算结果放入其中,然后将表单提交到另一个 PHP 页面进行处理。问题是,计算结果一直是负数并且在几万亿范围内(即十四位数字:-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。您在加载事件中调用它!

来自 MSDN 文档:

loadEventEnd 属性必须返回当前文档的加载事件完成的时间。当加载事件未触发或未完成时,它必须返回零。

怎么修:

使用 setTimeout 以便 onload 可以结束。

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 回答