UNPKG

xys-monitor

Version:

A project named xys-monitor

87 lines (71 loc) 3.41 kB
import { hijack, isType, getDomAttr } from './util' import xhr from './xhr' class Collect { constructor (reportSys) { this.reportSys = reportSys this.resource = ['script', 'img', 'link', 'video', 'audio'] this.resourceIgnoreList = [] this.bindEvent() } bindEvent () { let _this = this //监听脚本资源请求错误 window.addEventListener('error', function (e) { let target = e.target || e.srcElement let src = getDomAttr(target, 'src') if (((target.nodeName && _this.resource.indexOf(target.nodeName.toLowerCase()) >= 0) || (target.tagName && _this.resource.indexOf(target.tagName.toLowerCase()) >= 0)) && src && _this.resourceIgnoreList.indexOf(src.toLowerCase()) < 0) { _this.resourceIgnoreList.push(src.toLowerCase()) let postdata = { errorMsg: (target.nodeName || target.tagName || '') + ' ' + (src || 'unkonw') + ' loaded fail', scriptUrl: (src) || 'unkonw', errorType: _this.reportSys.errTypeMap['resource_fail_error'] } _this.reportSys.report.reportError(postdata) } }, true) //监听非vue项目的js错误 hijack(window, 'onerror', function (errorMsg, scriptUrl, lineNo, columnNo, detail) { if (!/talicai/i.test(navigator.userAgent)) { let postdata = {} if (errorMsg && !(errorMsg.indexOf('WeixinJSBridge') >= 0)) { postdata.pageUrl = location.href postdata.errorMsg = errorMsg || '' postdata.scriptUrl = scriptUrl || '' postdata.lineNo = lineNo postdata.columnNo = columnNo postdata.errorType = detail ? detail.name : '' postdata.errorStack = detail ? detail.stack : '' _this.reportSys.report.reportError(postdata) } } }) if (document.fonts) { //监听字体文件加载错误 该方法ie和edge不支持 hijack(document.fonts, 'onloadingerror', function (e) { if (e.fontfaces && isType(e.fontfaces, 'Array')) { let fontErrorArr = [] e.fontfaces.map(item => { fontErrorArr.push(item.family) }) _this.reportSys.report.reportError({ pageUrl: location.href, errorMsg: 'font < ' + fontErrorArr.join(' , ') + ' > loaded fail in ' + location.href, errorType: _this.reportSys.errTypeMap['font_fail_error'] }) } }) } xhr(_this.reportSys) window.addEventListener('unhandledrejection', function (event) { _this.reportSys.report.reportError({ errorMsg: (event.reason && event.reason.message) || '', errorStack: (event.reason && event.reason.stack) || '', errorType: _this.reportSys.errTypeMap['unhandledrejection'] }) }) } addPlugin (plugin, Frame) { plugin(this.reportSys, Frame) } } export default Collect