首页 > 其他分享 >旧系统网页性能收集,兼容IE5,低侵入收集网页脚本

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

时间:2023-09-04 15:45:21浏览次数:36  
标签:function ClientInfo 网页 收集 fmt IE5 xmlhttp var new

开发背景

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

收集要素

  • 进入页面时间,加载Js时间
  • 页面所有元素加载完成时间
  • 因为在原网页将该脚本放到最前面,故两者时间差为用户实际等待页面Ready时间(白屏),实际体验可能与渲染引擎相关(现代浏览器 大大快于IE,故该指标可作参考)
  • IE 打开页面默认弹窗,会影响结束时间,会以用户点击弹窗作为结束
  • 浏览器信息等可自行拓展

# 使用方法
- 引入代码文件,并给特定`id`, 相应标签属性可追加自定义值,用于辅助统计
- 涉及js 回调,所以需要提前赋值


# 技术特点
- 浏览器兼容(主要是IE 5、低侵入)
- 无三方库,考虑方便快速拓展

(function () {

Date.prototype.pattern = function (fmt) {
	var o = {
		"M+": this.getMonth() + 1, //月份         
		"d+": this.getDate(), //日         
		"h+": this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时         
		"H+": this.getHours(), //小时         
		"m+": this.getMinutes(), //分         
		"s+": this.getSeconds(), //秒         
		"q+": Math.floor((this.getMonth() + 3) / 3), //季度         
		"S": this.getMilliseconds() //毫秒         
	};
	var week = {
		"0": "/u65e5",
		"1": "/u4e00",
		"2": "/u4e8c",
		"3": "/u4e09",
		"4": "/u56db",
		"5": "/u4e94",
		"6": "/u516d"
	};
	if (/(y+)/.test(fmt)) {
		fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
	}
	if (/(E+)/.test(fmt)) {
		fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "/u661f/u671f" : "/u5468") : "") + week[this.getDay() + ""]);
	}
	for (var k in o) {
		if (new RegExp("(" + k + ")").test(fmt)) {
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
		}
	}
	return fmt;
}

function getJsScriptDataScript() {
	var data = document.getElementById('statisticalScriptId').getAttribute('data');
	var key = 'code';
	if (data) {
		var result = data.match(new RegExp(key + "=[^\?\&]+", "g"));
		var value = result ? result[0].split('=')[1] : '';
		return value;
	}

	return '';
}

function getJsScriptRemark() {
	return document.getElementById('statisticalScriptId').src;
}

//兼容bind函数
if (!Function.prototype.bind) {
	Function.prototype.bind = function () {
		if (typeof this !== 'function') {
			throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
		}
		var _this = this;
		var obj = arguments[0];
		var ags = Array.prototype.slice.call(arguments, 1);
		return function () {
			_this.apply(obj, ags);
		};
	};
}

//兼容addEventListener函数
function addEventListener(ele, event, fn) {
	if (ele.addEventListener) {
		ele.addEventListener(event, fn, false);
	} else {
		ele.attachEvent('on' + event, fn.bind(ele));
	}
}

//兼容removeEventListener函数
function removeEventListener(ele, event, fn) {
	if (ele.removeEventListener) {
		ele.removeEventListener(event, fn, false);
	} else {
		ele.detachEvent('on' + event, fn.bind(ele));
	}
}

//闭包自治性
var ClientInfo = {
	InJsTime: '',
	InteractiveTime: '',
	DOMContentLoadedTime:'',
	LoadTime: '',
	ComputeName: '',
	UserName: '',
	IdentifyCode: getJsScriptDataScript(),
	Remark: getJsScriptRemark(),

	Href: '',
	Origin: '',
	Host: '',
	Port: '',
	PathName:''
};
ClientInfo.InJsTime = getNowDateTime();

try {
    var WshShell = new ActiveXObject("WScript.Shell");
    //document.write("计算机名 = " + WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%") + "<br/>");
    //document.write("登录用户名 = " + WshShell.ExpandEnvironmentStrings("%USERNAME%") + "<br/>");
    ClientInfo.ComputeName = WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%");
    ClientInfo.UserName = WshShell.ExpandEnvironmentStrings("%USERNAME%");

} catch (e) {

}

addEventListener(window, 'load', function () {
	//console.log('window load ' + (new Date()).pattern("yyyy-MM-dd hh:mm:ss S"));
	ClientInfo.LoadTime = getNowDateTime();
	sendData();
});

addEventListener(document, 'readystatechange', function () {
	var state = document.readyState;
	if (state == 'interactive') {
		ClientInfo.InteractiveTime = getNowDateTime();
		//console.log('document ' + document.readyState + (new Date()).pattern("yyyy-MM-dd hh:mm:ss S"));
	}
});

addEventListener(document, 'DOMContentLoaded', function () {
	ClientInfo.DOMContentLoadedTime = getNowDateTime();
	//console.log('document DOMContentLoaded' + (new Date()).pattern("yyyy-MM-dd hh:mm:ss S"));
});

function getNowDateTime() {
	var timeOffSet = (new Date()).getTimezoneOffset();

	return (new Date()).getTime() - timeOffSet * 60 * 1000; //(new Date()).pattern("yyyy-MM-dd hh:mm:ss S");
}

function sendData() {
	ClientInfo.Href = window.location.href;
	ClientInfo.Origin = window.location.origin;
	ClientInfo.Host = (window.location.host).toLowerCase().replace(/.chn.nexchip/, "");
	ClientInfo.Port = window.location.port;
	ClientInfo.PathName = window.location.pathname;

	var hostArray = 'xxxt01,xxxs01,xxxs02';
	var url = '';
	if (borGHostArray.indexOf(ClientInfo.Host) > -1) {
		url = window.location.protocol + "//" + window.location.host + "/bridgeapi/Api/BridgePageRecord/PostData"
	} else {
		url = 'http://xxxs01x/msgcenterapi/Api/SeriPageLoadRecord/PostData';
    }

	var paramObj = {
		httpUrl:url,
		type: 'post',
		data: ClientInfo			
	}

	/*请求调用*/
	httpRequest(paramObj, function (respondDada) {
		//这里编写成功的回调函数
		//console.log(respondDada)
	}, function () {
		//console.log('网络错误');
	});
}

function httpRequest(paramObj, fun, errFun) {
	var xmlhttp = null;
	/*创建XMLHttpRequest对象,
	 *老版本的 Internet Explorer(IE5 和 IE6)使用 ActiveX 对象:new ActiveXObject("Microsoft.XMLHTTP")
	 * */
	if (window.XMLHttpRequest) {
		xmlhttp = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	/*判断是否支持请求*/
	if (xmlhttp == null) {
		alert('你的浏览器不支持XMLHttp');
		return;
	}
	/*请求方式,并且转换为大写*/
	var httpType = (paramObj.type || 'GET').toUpperCase();
	/*数据类型*/
	var dataType = paramObj.dataType || 'json';
	/*请求接口*/
	var httpUrl = paramObj.httpUrl || '';
	/*是否异步请求*/
	var async = paramObj.async || true;
	/*请求参数--post请求参数格式为:foo=bar&lorem=ipsum*/
	var paramData = paramObj.data || [];
	var requestData = '';
	for (var name in paramData) {
		requestData += name + '=' + paramData[name] + '&';
	}
	requestData = requestData == '' ? '' : requestData.substring(0, requestData.length - 1);
	//console.log(requestData)

	/*请求接收*/
	xmlhttp.onreadystatechange = function () {
		if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
			/*成功回调函数*/
			fun(xmlhttp.responseText);
		} else {
			/*失败回调函数*/
			errFun;
		}
	}

	/*接口连接,先判断连接类型是post还是get*/
	if (httpType == 'GET') {
		xmlhttp.open("GET", httpUrl, async);
		xmlhttp.send(null);
	} else if (httpType == 'POST') {
		xmlhttp.open("POST", httpUrl, async);
		//发送合适的请求头信息
		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlhttp.send(requestData);
	}
}

	//setTimeout(function () { alert('表单打开超过20分钟,请先暂存或刷新,否则可能会丢失数据') }, 1000 * 60 * 20);

})();

标签:function,ClientInfo,网页,收集,fmt,IE5,xmlhttp,var,new
From: https://www.cnblogs.com/hijushen/p/17677231.html

相关文章

  • vue3 使用vue-router 进行网页跳转以及获取问号后面的参数
    关键代码:constrouter=useRouter()constauthor='myname'router.push({name:'Edit',query:{author}})constroute=useRoute()constvalue=route.query.key详细步骤:0.Initialgitclonehttps://github.com/element-plus/element-plus-v......
  • 喜马拉雅 网页 滑块 简单
     functionpostveri(){leto=+newDate,W="xm_"+o.toString(36)+Math.random().toString(36).substr(2,6);return{'bpId':'139','sessionId':W,}}V=functionV(){......
  • 初三学生编写网页版 Windows 12
    初三学生编写网页版Windows12来源:OSCHINA编辑: 局2023-09-0316:13:00 7一名初三学生用前端开发三件套——HTML+CSS+JavaScript实现了一个网页版的Windows12。他表示在网上看到Windows12概念版(PoweredbyPowerPoint)后深受启发,因此决定做一个W......
  • 使用Nginx做页面采集, Kafka收集到对应Topic_6XwWe5qWHGM2PojVPUSejM
    使用Nginx做页面采集,Kafka收集到对应Topic_6XwWe5qWHGM2PojVPUSejM使用Nginx做页面采集,Kafka收集到对应Topic0.架构简介模拟线上的实时流,比如用户的操作日志,采集到数据后,进行处理,暂时只考虑数据的采集,使用Html+Jquery+Nginx+Ngx_kafka_module+Kafka来实现,其中Ngx​kafka​m......
  • 使用Nginx做页面采集, Kafka收集到对应Topic_6XwWe5qWHGM2PojVPUSejM
    使用Nginx做页面采集,Kafka收集到对应Topic_6XwWe5qWHGM2PojVPUSejM使用Nginx做页面采集,Kafka收集到对应Topic0.架构简介模拟线上的实时流,比如用户的操作日志,采集到数据后,进行处理,暂时只考虑数据的采集,使用Html+Jquery+Nginx+Ngx_kafka_module+Kafka来实现,其中Ngx​kafka​m......
  • 使用Nginx做页面采集, Kafka收集到对应Topic_6XwWe5qWHGM2PojVPUSejM
    使用Nginx做页面采集,Kafka收集到对应Topic_6XwWe5qWHGM2PojVPUSejM使用Nginx做页面采集,Kafka收集到对应Topic0.架构简介模拟线上的实时流,比如用户的操作日志,采集到数据后,进行处理,暂时只考虑数据的采集,使用Html+Jquery+Nginx+Ngx_kafka_module+Kafka来实现,其中Ngx​kafka​m......
  • 网页版B站暗黑模式:Chrome Dark Reader 插件
    https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh?utm_source=ext_app_menu使用说明https://darkreader.org/help/zh-CN/效果还不错......
  • EasyPlayer开放外部录像接口:自由扩展H.265网页播放功能
    EasyPlayer通过实现视频实时录像功能,不仅提供轻量化、便捷化的视频资源下载能力,同时有效减少了带宽和计算资源的消耗。这种创新的功能使得用户可以灵活地获取所需的视频数据,为其节省使用成本并提升整体效率。今天我们来分享一下EasyPlayer播放器对外开放录像的方法。1)在播放器内部......
  • jiangly算法模板收集
    目录数据结构树状数组并查集线段树其一其二其三懒标记线段树取模类(新版)取模类(旧版)树链剖分Splay其他二叉树其一其二分数四则运算数论欧拉筛组合数多项式相关几何图论(有向图)强连通分量缩点(无向图)求解割边、割边缩点一般图最大匹配(带花树算法)【久远】最大流费用流2-Sat【久远】字符......
  • 使用css3给网页元素出场动画让页面动起来
    使用css3给网页元素出场动画让页面动起来一般情况下网页元素都是静态显示的,能不能做一个幻灯片那样增加个动画出场效果呢这里使用css实现简单效果css样式test.css*,*:after,*::before{ -moz-box-sizing:border-box; box-sizing:border-box; }body,h1,h2,h3,h4,h5,h......