-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmonitor.js
101 lines (92 loc) · 2.94 KB
/
monitor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
(function(global) {
var oldErrFn = global.onerror,
list=[],
timeout,
imgs=document.images,
imgLen=imgs.length,
cfg={
url:'',
delay:1000
};
for(var i=0;i<imgLen;i++){
(function(img){
if(img.complete){
if(img.naturalWidth==0 && img.naturalHeight==0){
addNewError({
msg:location.href+',图片加载失败',
target:img.src,
rowNum:0,
colNum:0
});
}
}
img.onerror=function(){
addNewError({
msg:location.href+',图片加载失败',
target:img.src,
rowNum:0,
colNum:0
});
}
}(imgs[i]));
}
global.onerror = function(msg, url, line, col,error) {
msg=(error && error.stack)||msg;
addNewError({
msg: msg,
target: url||'',
rowNum: line||1,
colNum: col||1
});
oldErrFn && oldErrFn.apply(global,arguments);
return true;
};
function addNewError(msg) { // 将错误推到缓存池
list.push(JSON.stringify(msg));
clearTimeout(timeout);
timeout=setTimeout(function(){
sendError();
},cfg.delay);
}
function charLen(string) {
if (!string) return 0;
return string.replace(/[^\x00-\xff]/g, '00').length;
}
function init(opts){
for (var key in opts) {
cfg[key] = opts[key];
}
//todo 取出本地发送失败的,继续发送
// reSendInfo();
}
function sendError(){
var img=new Image(),
count= 0,
infos='',
infosLen=0,
info,
infoLen;
while(list.length){
info=list.shift();
infoLen=parseInt(charLen(info),10);
//分段处理
if(infosLen+infoLen>2000){
list.unshift(info);
setTimeout(sendError,0);
break;
}else{
infos+=info;
infosLen+=infoLen;
count++;
}
}
img.src=cfg.url+'infos='+infos+'&count='+count+'&_t='+(+new Date);
img.onerror=function(){
//todo 存入本地,下次继续发送
}
}
return global.jsm={
init:init,
send:addNewError
}
}(this));