翼度科技»论坛 编程开发 JavaScript 查看内容

旧系统网页性能收集,兼容IE5,低侵入收集网页脚本

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
开发背景


  • 短时间内完成网页性能统计上传,考虑到企业内实际环境,很多网页/系统需要运行在IE 5 兼容模式下,开发一个脚本,在不影响原网页的情况下,收集相应 用户电脑 打开网页的性能指标。
收集要素


  • 进入页面时间,加载Js时间
  • 页面所有元素加载完成时间
  • 因为在原网页将该脚本放到最前面,故两者时间差为用户实际等待页面Ready时间(白屏),实际体验可能与渲染引擎相关(现代浏览器 大大快于IE,故该指标可作参考)
  • IE 打开页面默认弹窗,会影响结束时间,会以用户点击弹窗作为结束
  • 浏览器信息等可自行拓展
  1. # 使用方法
  2. - 引入代码文件,并给特定`id`, 相应标签属性可追加自定义值,用于辅助统计
  3. - 涉及js 回调,所以需要提前赋值
  4. # 技术特点
  5. - 浏览器兼容(主要是IE 5、低侵入)
  6. - 无三方库,考虑方便快速拓展
复制代码
(function () {
  1. Date.prototype.pattern = function (fmt) {
  2.         var o = {
  3.                 "M+": this.getMonth() + 1, //月份         
  4.                 "d+": this.getDate(), //日         
  5.                 "h+": this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时         
  6.                 "H+": this.getHours(), //小时         
  7.                 "m+": this.getMinutes(), //分         
  8.                 "s+": this.getSeconds(), //秒         
  9.                 "q+": Math.floor((this.getMonth() + 3) / 3), //季度         
  10.                 "S": this.getMilliseconds() //毫秒         
  11.         };
  12.         var week = {
  13.                 "0": "/u65e5",
  14.                 "1": "/u4e00",
  15.                 "2": "/u4e8c",
  16.                 "3": "/u4e09",
  17.                 "4": "/u56db",
  18.                 "5": "/u4e94",
  19.                 "6": "/u516d"
  20.         };
  21.         if (/(y+)/.test(fmt)) {
  22.                 fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  23.         }
  24.         if (/(E+)/.test(fmt)) {
  25.                 fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "/u661f/u671f" : "/u5468") : "") + week[this.getDay() + ""]);
  26.         }
  27.         for (var k in o) {
  28.                 if (new RegExp("(" + k + ")").test(fmt)) {
  29.                         fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  30.                 }
  31.         }
  32.         return fmt;
  33. }
  34. function getJsScriptDataScript() {
  35.         var data = document.getElementById('statisticalScriptId').getAttribute('data');
  36.         var key = 'code';
  37.         if (data) {
  38.                 var result = data.match(new RegExp(key + "=[^\?\&]+", "g"));
  39.                 var value = result ? result[0].split('=')[1] : '';
  40.                 return value;
  41.         }
  42.         return '';
  43. }
  44. function getJsScriptRemark() {
  45.         return document.getElementById('statisticalScriptId').src;
  46. }
  47. //兼容bind函数
  48. if (!Function.prototype.bind) {
  49.         Function.prototype.bind = function () {
  50.                 if (typeof this !== 'function') {
  51.                         throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
  52.                 }
  53.                 var _this = this;
  54.                 var obj = arguments[0];
  55.                 var ags = Array.prototype.slice.call(arguments, 1);
  56.                 return function () {
  57.                         _this.apply(obj, ags);
  58.                 };
  59.         };
  60. }
  61. //兼容addEventListener函数
  62. function addEventListener(ele, event, fn) {
  63.         if (ele.addEventListener) {
  64.                 ele.addEventListener(event, fn, false);
  65.         } else {
  66.                 ele.attachEvent('on' + event, fn.bind(ele));
  67.         }
  68. }
  69. //兼容removeEventListener函数
  70. function removeEventListener(ele, event, fn) {
  71.         if (ele.removeEventListener) {
  72.                 ele.removeEventListener(event, fn, false);
  73.         } else {
  74.                 ele.detachEvent('on' + event, fn.bind(ele));
  75.         }
  76. }
  77. //闭包自治性
  78. var ClientInfo = {
  79.         InJsTime: '',
  80.         InteractiveTime: '',
  81.         DOMContentLoadedTime:'',
  82.         LoadTime: '',
  83.         ComputeName: '',
  84.         UserName: '',
  85.         IdentifyCode: getJsScriptDataScript(),
  86.         Remark: getJsScriptRemark(),
  87.         Href: '',
  88.         Origin: '',
  89.         Host: '',
  90.         Port: '',
  91.         PathName:''
  92. };
  93. ClientInfo.InJsTime = getNowDateTime();
  94. try {
  95.     var WshShell = new ActiveXObject("WScript.Shell");
  96.     //document.write("计算机名 = " + WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%") + "<br/>");
  97.     //document.write("登录用户名 = " + WshShell.ExpandEnvironmentStrings("%USERNAME%") + "<br/>");
  98.     ClientInfo.ComputeName = WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%");
  99.     ClientInfo.UserName = WshShell.ExpandEnvironmentStrings("%USERNAME%");
  100. } catch (e) {
  101. }
  102. addEventListener(window, 'load', function () {
  103.         //console.log('window load ' + (new Date()).pattern("yyyy-MM-dd hh:mm:ss S"));
  104.         ClientInfo.LoadTime = getNowDateTime();
  105.         sendData();
  106. });
  107. addEventListener(document, 'readystatechange', function () {
  108.         var state = document.readyState;
  109.         if (state == 'interactive') {
  110.                 ClientInfo.InteractiveTime = getNowDateTime();
  111.                 //console.log('document ' + document.readyState + (new Date()).pattern("yyyy-MM-dd hh:mm:ss S"));
  112.         }
  113. });
  114. addEventListener(document, 'DOMContentLoaded', function () {
  115.         ClientInfo.DOMContentLoadedTime = getNowDateTime();
  116.         //console.log('document DOMContentLoaded' + (new Date()).pattern("yyyy-MM-dd hh:mm:ss S"));
  117. });
  118. function getNowDateTime() {
  119.         var timeOffSet = (new Date()).getTimezoneOffset();
  120.         return (new Date()).getTime() - timeOffSet * 60 * 1000; //(new Date()).pattern("yyyy-MM-dd hh:mm:ss S");
  121. }
  122. function sendData() {
  123.         ClientInfo.Href = window.location.href;
  124.         ClientInfo.Origin = window.location.origin;
  125.         ClientInfo.Host = (window.location.host).toLowerCase().replace(/.chn.nexchip/, "");
  126.         ClientInfo.Port = window.location.port;
  127.         ClientInfo.PathName = window.location.pathname;
  128.         var hostArray = 'xxxt01,xxxs01,xxxs02';
  129.         var url = '';
  130.         if (borGHostArray.indexOf(ClientInfo.Host) > -1) {
  131.                 url = window.location.protocol + "//" + window.location.host + "/bridgeapi/Api/BridgePageRecord/PostData"
  132.         } else {
  133.                 url = 'http://xxxs01x/msgcenterapi/Api/SeriPageLoadRecord/PostData';
  134.     }
  135.         var paramObj = {
  136.                 httpUrl:url,
  137.                 type: 'post',
  138.                 data: ClientInfo                       
  139.         }
  140.         /*请求调用*/
  141.         httpRequest(paramObj, function (respondDada) {
  142.                 //这里编写成功的回调函数
  143.                 //console.log(respondDada)
  144.         }, function () {
  145.                 //console.log('网络错误');
  146.         });
  147. }
  148. function httpRequest(paramObj, fun, errFun) {
  149.         var xmlhttp = null;
  150.         /*创建XMLHttpRequest对象,
  151.          *老版本的 Internet Explorer(IE5 和 IE6)使用 ActiveX 对象:new ActiveXObject("Microsoft.XMLHTTP")
  152.          * */
  153.         if (window.XMLHttpRequest) {
  154.                 xmlhttp = new XMLHttpRequest();
  155.         } else if (window.ActiveXObject) {
  156.                 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  157.         }
  158.         /*判断是否支持请求*/
  159.         if (xmlhttp == null) {
  160.                 alert('你的浏览器不支持XMLHttp');
  161.                 return;
  162.         }
  163.         /*请求方式,并且转换为大写*/
  164.         var httpType = (paramObj.type || 'GET').toUpperCase();
  165.         /*数据类型*/
  166.         var dataType = paramObj.dataType || 'json';
  167.         /*请求接口*/
  168.         var httpUrl = paramObj.httpUrl || '';
  169.         /*是否异步请求*/
  170.         var async = paramObj.async || true;
  171.         /*请求参数--post请求参数格式为:foo=bar&lorem=ipsum*/
  172.         var paramData = paramObj.data || [];
  173.         var requestData = '';
  174.         for (var name in paramData) {
  175.                 requestData += name + '=' + paramData[name] + '&';
  176.         }
  177.         requestData = requestData == '' ? '' : requestData.substring(0, requestData.length - 1);
  178.         //console.log(requestData)
  179.         /*请求接收*/
  180.         xmlhttp.onreadystatechange = function () {
  181.                 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  182.                         /*成功回调函数*/
  183.                         fun(xmlhttp.responseText);
  184.                 } else {
  185.                         /*失败回调函数*/
  186.                         errFun;
  187.                 }
  188.         }
  189.         /*接口连接,先判断连接类型是post还是get*/
  190.         if (httpType == 'GET') {
  191.                 xmlhttp.open("GET", httpUrl, async);
  192.                 xmlhttp.send(null);
  193.         } else if (httpType == 'POST') {
  194.                 xmlhttp.open("POST", httpUrl, async);
  195.                 //发送合适的请求头信息
  196.                 xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  197.                 xmlhttp.send(requestData);
  198.         }
  199. }
复制代码
  1.         //setTimeout(function () { alert('表单打开超过20分钟,请先暂存或刷新,否则可能会丢失数据') }, 1000 * 60 * 20);
  2. })();
复制代码
来源:https://www.cnblogs.com/hijushen/p/17677231.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具