UNPKG

js-monitors

Version:

The js-monitors library as Front-end code exception monitoring

222 lines (217 loc) 6.85 kB
(function (window) { // 上传错误的网址 const url = document.body.className; if (!url) { return false; } /** * @des 私有方法 * @param {Object} arg, 错误信息对象 * @private */ function error(arg) { if (typeof arg === 'string') { return false; } var errorMsg = { viewUrl: decodeURIComponent(location.href), //URL date: dateFun(), //发生的时间 platform: window.navigator.platform, //手机型号 device: browserRedirect(), // 手机端还是pc端 ua: window.navigator.userAgent.toString(), //UserAgent filePath: (document.currentScript && document.currentScript.src) || '', //出错的文件 line: 0, //出错文件所在行 col: (window.event && window.event.errorCharacter) || 0, //出错文件所在列 lang: navigator.language || navigator.browserLanguage || '', //使用的语言 screen: window.screen.width + ' * ' + window.screen.height, //分辨率 charset: document.characterSet ? document.characterSet : document.charset, //浏览器编码环境 info: '无错误描述!', //错误信息 errStack: '', // 错误栈信息 }; for (var i in arg) { if (arg[i] != '') { errorMsg[i] = arg[i]; } } console.log(errorMsg); //错误信息上报 setTimeout(function () { send({ url: url, data: errorMsg, }); }, 0); } function browserRedirect() { var browser = { versions: (function () { var u = navigator.userAgent, app = navigator.appVersion; return { //移动终端浏览器版本信息 trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或uc浏览器 iPhone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') > -1, //是否iPad webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部 }; })(), language: (navigator.browserLanguage || navigator.language).toLowerCase(), }; if (browser.versions.mobile) { //判断是否是移动设备打开。browser代码在下面 var ua = navigator.userAgent.toLowerCase(); //获取判断用的对象 if (ua.match(/MicroMessenger/i) == 'micromessenger') { //在微信中打开 return 'WeChat Browser'; } if (ua.match(/WeiBo/i) == 'weibo') { //在新浪微博客户端打开 return 'WeiBo Browser'; } if (ua.match(/QQ/i) == 'qq') { //在QQ空间打开 return 'QQ Brower'; } if (browser.versions.ios) { //是否在IOS浏览器打开 return 'IOS Brower'; } if (browser.versions.android) { //是否在安卓浏览器打开 return 'Android Brower'; } } else { //否则就是PC浏览器打开 return 'PC Brower'; } } /** * @des 处理时间 * @return YYYY-MM-DD hh:mm:ss * @private */ function dateFun() { var date = new Date(); return ( date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() + ' ' + date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds() ); } /** * @des 将对象转为键值对参数字符串。 * @param {Object} obj 参数列表对象 * @return 返回拼接之后的参数列表字符串 * @private */ function param(obj) { if (Object.prototype.toString.call(obj) !== '[object Object]') { return false; } var array = []; for (var k in obj) { if (!Object.prototype.hasOwnProperty.call(obj, k)) { return false; } if (obj[k] != '') { array.push(k + '=' + encodeURIComponent(obj[k])); } } return array.join('&'); } /** * @des 创建一个HTTP GET 请求 * @param {Object} obj 参数列表对象 {url:'',data:{},callback:function(){}} * @private */ function send(obj) { if (!obj.callback) { obj.callback = function () {}; } var d = param(obj.data), url = obj.url + (obj.url.indexOf('?') < 0 ? '?' : '&') + d; // 忽略超长 url 请求,避免资源异常。 if (url.length > 7713) { return; } if (window.navigator.onLine) { var img = new Image(1, 1); img.onload = img.onerror = img.onabort = function () { obj.callback(); img.onload = img.onerror = img.onabort = null; img = null; }; img.src = url; } } // 使用onerror事件捕获页面中的错误 function jsMonitor() { window.onerror = function (_message, _url, _line, _column, _error) { //没有URL不上报!上报也不知道错误 if (_message === 'Script error.' && !_url) { return true; } var params_obj = { info: _message, filePath: _url, line: _line, col: _column, }; // 如果有错误详情 赋值到stack属性中 if (_error && _error.stack) { // 打印错误堆栈 params_obj.errStack = (_error.stack || _error.stacktrace).toString(); } error(params_obj); return true; }; } window.onerror = function (_message, _url, _line, _column, _error) { //没有URL不上报!上报也不知道错误 if (_message === 'Script error.' && !_url) { return true; } var params_obj = { info: _message, filePath: _url, line: _line, col: _column, }; // 如果有错误详情 赋值到stack属性中 if (_error && _error.stack) { // 打印错误堆栈 params_obj.errStack = (_error.stack || _error.stacktrace).toString(); } error(params_obj); return true; }; if ( typeof define === 'function' && typeof define.amd === 'object' && define.amd ) { // AMD. Register as an anonymous module. define(function () { return jsMonitor; }); } else if (typeof module !== 'undefined' && module.exports) { module.exports = jsMonitor; module.exports.jsMonitor = jsMonitor; } else { window.jsMonitor = jsMonitor; } })(window);