Javascript 为什么我用Web性能API测量渲染时间的尝试总是导致负值

Javascript 为什么我用Web性能API测量渲染时间的尝试总是导致负值,javascript,html,performance,benchmarking,navigation-timing-api,Javascript,Html,Performance,Benchmarking,Navigation Timing Api,我正在构建一个基于web的页面渲染基准应用程序,它使用web性能API。它所做的基本上是测量浏览器在命令呈现一组div元素,然后构建一个隐藏表单,将计算结果放入其中,然后将表单提交到另一个PHP页面进行处理时所花费的时间。 问题是,计算结果一直是负数,在数万亿范围内(即14位数字:-1364403484035)。代码如下: window.onload=function(){ results=(performance.timing.loadEventEnd-performa

我正在构建一个基于web的页面渲染基准应用程序,它使用web性能API。它所做的基本上是测量浏览器在命令呈现一组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控制台查看变量的值,我发现 这是因为loadEventEnd是在window.load完成时设置的。您正在加载事件中调用它

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
,直到它不为零

使用回飞棒()。生命太短暂,无法编写自己的导航计时库

您必须让负载完全运行。你的“编辑”正是我回答的第一部分告诉你发生了什么,这很好。谢谢在提交更新1之前,我没有刷新页面。现在,0毫秒超时如何允许事件在执行之前结束?JS setTimout如何与HTML事件交互?我很困惑。但这可能是另一个问题,因为setTimeout增加了足够的延迟,window.onload才能完全完成。