xys-monitor
Version:
A project named xys-monitor
87 lines (71 loc) • 3.41 kB
JavaScript
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