javascript页面渲染速度测试脚本分享


Posted in Javascript onApril 15, 2014
/* 获取渲染开始的时间戳, 保存在数组PAGE_SPEED_TIME中 */
<html><script type="text/javascript">/*tag*/PAGE_SPEED_TIME = [new Date().getTime()];</script><head>
......
</head>
......
/* 页面最末端,计算页面加载耗用的时间 */
</body>
<script src="http://ossweb-img.qq.com/images/js/pagespeed/page_speed_v2.js"></script></html>

下面来分析一下page_speed_v2.js文件的内容。对这个脚本进行重新格式化,以便更加方便阅读。

/* 执行匿名函数构建对象PageSpeed */
;(function() {
    PageSpeed = {};/* 这里没有 var 关键字, 相当于引用的是 window.PageSpeed */
 /**
     * 绑定createScript方法
  *
  * @param String a script标签的src属性的值
  * @param String b script标签的id属性的值
  */
    PageSpeed.createScript = function(a, b) {
        var c = null;
        if (document.getElementById(b)) { /* script标签已经存在 */
            c = document.getElementById(b)
        } else { /* 不存在, 创建script标签 */
            c = document.createElement('script');
            var d = null;
            if (document.getElementsByTagName) {
                d = document.getElementsByTagName('head')[0] || document.documentElement;
            } else {
                d = document.documentElement;
            }
            d.insertBefore(c, d.firstChild); /* 调用insertBefore方法, 将新创建的script标签插入为第一个子元素 */
        }
  /* 这里的花括号起到代码片段分组功能 */
  {
            c.setAttribute('type', 'text/html');
            c.setAttribute('style', 'display:none;');
            c.setAttribute('charset', 'gb2312');
            c.setAttribute('id', b);
            c.setAttribute('src', a);
        }
        return c; /* 返回创建成功的script标签元素 */
    };
 /**
     * 绑定 submitDataForPageSpeed 方法
  *
  * @param Object a Map对象
  */
    PageSpeed.submitDataForPageSpeed = function(a) {
        var b = {
            'name': '',
            'rate': 0
        };
        b.name = a.name;
        b.rate = a.rate;
  /* a.PAGE_SPEED_TIME数组的最后一个元素减去第一个元素 */
        b['1'] = a.PAGE_SPEED_TIME[a.PAGE_SPEED_TIME.length - 1] - a.PAGE_SPEED_TIME[0];
        for (var i = 1; i < a.PAGE_SPEED_TIME.length - 1; i++) {
            b[(i + 1) + ''] = a.PAGE_SPEED_TIME[i] - a.PAGE_SPEED_TIME[0]
        }
  /* 提交速度测试结果的目的脚本 */
        var c = 'http://pagespeed-ied.qq.com/r.cgi';
  /* 遍历 b 数组的元素, 构建 query string */
        var d = [];
        for (var p in b) {
            d.push(p + '=' + b[p])
        }
        c += '?' + d.join('&');
  /* 创建script标签提交测速结果 */
        PageSpeed.createScript(c, 'submitForPageSpeed')
    };
 /**
  * 绑定 defaultSubmit 方法
  *
  */
    PageSpeed.defaultSubmit = function() {
        var a = '';
        try {
            a = location.host
        } catch(e) {}
        var b = {
            'name': a,
            'rate': 1,
            'PAGE_SPEED_TIME': []
        };
        if (!b.name) {
            return
        }
        if (! (typeof(PAGE_SPEED_TIME) == 'object' && PAGE_SPEED_TIME instanceof Array)) {
            return
        }
  /* 获取新的时间戳 */
        PAGE_SPEED_TIME.push(new Date().getTime());
        b.PAGE_SPEED_TIME = PAGE_SPEED_TIME;
  /*
   * 没看懂这里为啥需要一个新的变量 aaa, 直接使用 a 不可以么?
   * try ... catch 结构中使用的却是一个新的变量 aaaa 但后面却从未使用, 为何? 是否应该是 aaa?
   */
        var aaa = '';
        try {
            aaaa = location.host
        } catch(e) {}
        var c = Math.floor(Math.random() * 10000);
        if (aaa == "ktv.qq.com" || aaa == "ttd.qq.com" || aaa == "tian.qq.com" || aaa == "sura.qq.com" || aaa == "gw.tnt.qq.com" || aaa == "007.qq.com") {
            c = Math.floor(Math.random() * 1000);
        }
  /* 随机概率提交数据 */
        if (c <= b.rate * 1) {
            PageSpeed.submitDataForPageSpeed(b);
        }
    };
 /**
  * 绑定submit方法(用于CDN测速?)
  *
  * @param String a 名称
  */
    PageSpeed.submit = function(a) {
        var b = PageSpeed.cdn_page_speed_submitData;
        var c = {};
        for (var p in b) {
            c[p] = b[p]
        }
        c.name = a || c.name;
        PageSpeed.submitDataForPageSpeed(c);
    }
})();
try {
    /* 1秒后尝试提交数据 */
    setTimeout(function() {
        PageSpeed.defaultSubmit()
    },
    1000);
} catch(e) {}
/* 最后这段注释, 第二段是32位16进制数字, 应该是类似于 ETag 用于标记内容版本的 */
/*  |xGv00|ca82276cd78ac911d3d4310ba1408236 */
Javascript 相关文章推荐
如何使用Jquery获取Form表单中被选中的radio值
Aug 09 Javascript
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
jQuery中innerHeight()方法用法实例
Jan 19 Javascript
浅谈Unicode与JavaScript的发展史
Jan 19 Javascript
jQuery中$.each()函数的用法引申实例
May 12 Javascript
js前端面试题及答案整理(一)
Aug 26 Javascript
Bootstrap php制作动态分页标签
Dec 23 Javascript
Vue-Router进阶之滚动行为详解
Sep 13 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
Sep 23 Javascript
微信小程序全局变量的设置、使用、修改过程解析
Sep 24 Javascript
JS+canvas五子棋人机对战实现步骤详解
Jun 04 Javascript
js中实现继承的五种方法
Jan 25 Javascript
JS实现静止元素自动移动示例
Apr 14 #Javascript
js 获取元素下面所有li的两种方法
Apr 14 #Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
Apr 14 #Javascript
jquery使用jxl插件导出excel示例
Apr 14 #Javascript
js 获取input点选按钮的值的方法
Apr 14 #Javascript
js生成动态表格并为每个单元格添加单击事件的方法
Apr 14 #Javascript
Js实现动态添加删除Table行示例
Apr 14 #Javascript
You might like
一步一步学习PHP(8) php 数组
2010/03/05 PHP
php 获取全局变量的代码
2011/04/21 PHP
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
Chrome Web App开发小结
2014/09/04 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
vue中echarts3.0自适应的方法
2018/02/26 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
softmax及python实现过程解析
2019/09/30 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
女生抽烟检讨书
2014/10/05 职场文书
自荐信模板大全
2015/03/27 职场文书
2015年档案室工作总结
2015/05/23 职场文书
小马王观后感
2015/06/11 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
Redis Lua脚本实现ip限流示例
2022/07/15 Redis