Yang's Blog

一些代码整理

今天有朋友问了我关于visibilitychange监听事件、ajax 请求、 jsonp 请求的问题,就做了一些总结。

visibilitychange监听事件来判断页面可见性,这个事件可以满足一些用户需求,比如标签页隐藏的时候停止播放音乐视频、停止一些不必要的轮询,还有停止一些诸如轮播等循环动画效果等等。这些可以节省服务器和本地的开销。

ajax 请求与 jsonp 请求

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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
var yang = yang || {};
// visibilitychange监听事件来判断页面可见性,
// 这个事件可以满足一些用户需求,比如标签页隐藏的时候停止播放音乐视频、停止一些不必要的轮询,
// 还有停止一些诸如轮播等循环动画效果等等。这些可以节省服务器和本地的开销。
yang.visibility = {
browerKernel: function () {
var result;
['webkit', 'moz', 'o', 'ms'].forEach(function (prefix) {
if (typeof document[ prefix + 'Hidden' ] != 'undefined') {
result = prefix;
}
});
return result;
},
init: function (Callbak) {
var prefix = this.browerKernel();
/* function isFunction(fn) {
return Object.prototype.toString.call(fn) === '[object Function]';
}
console.log(isFunction(Callbak)); */
if (Object.prototype.toString.call(Callbak) === '[object Function]') {
Callbak();
document.addEventListener(prefix + 'visibilitychange', function (e) {
Callbak(document[prefix + 'VisibilityState']);
});
} else {
document.title = Callbak;
}
}
};
/*
// yang.visibility.init()方法的调用与说明
// Callbak是一个回调函数
yang.visibility.init(function (v) {
document.title = '进入页面';
if (v == 'visible') {
document.title = '进入页面';
} else if (v == 'hidden') {
document.title = '离开页面';
}
});
*/
// ajax请求与jsonp请求
yang.ajax = function (params) {
params = params || {};
params.data = params.data || {};
var json = params.jsonp ? jsonp(params) : json(params);
// ajax请求
function json(params) {
// 请求方式,默认是GET
params.type = (params.type || 'GET').toUpperCase();
// 避免有特殊字符,必须格式化传输数据
params.data = formatParams(params.data);
var xhr = null;
// 实例化XMLHttpRequest对象
if(window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
// IE6及其以下版本
xhr = new ActiveXObjcet('Microsoft.XMLHTTP');
};
// 监听事件,只要 readyState 的值变化,就会调用 readystatechange 事件
xhr.onreadystatechange = function() {
// readyState属性表示请求/响应过程的当前活动阶段,4为完成,已经接收到全部响应数据
if (xhr.readyState == 4) {
var status = xhr.status;
// status:响应的HTTP状态码,以2开头的都是成功
if (status >= 200 && status < 300) {
var response = '';
// 判断接受数据的内容类型
var type = xhr.getResponseHeader('Content-type');
if(type.indexOf('xml') !== -1 && xhr.responseXML) {
response = xhr.responseXML; //Document对象响应
} else if(type === 'application/json') {
response = JSON.parse(xhr.responseText); //JSON响应
} else {
response = xhr.responseText; //字符串响应
};
// 成功回调函数
params.success && params.success(response);
} else {
params.error && params.error(status);
}
};
};
// 连接和传输数据
if (params.type == 'GET') {
// 三个参数:请求方式、请求地址(get方式时,传输数据是加在地址后的)、是否异步请求(同步请求的情况极少)
xhr.open(params.type, params.url + '?' + params.data, true);
xhr.send(null);
} else {
xhr.open(params.type, params.url, true);
//必须,设置提交时的内容类型
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
// 传输数据
xhr.send(params.data);
}
}
// jsonp请求
function jsonp(params) {
//创建script标签并加入到页面中
var callbackName = params.jsonp;
var head = document.getElementsByTagName('head')[0];
// 设置传递给后台的回调参数名
params.data['callback'] = callbackName;
var data = formatParams(params.data);
var script = document.createElement('script');
head.appendChild(script);
//创建jsonp回调函数
window[callbackName] = function(json) {
head.removeChild(script);
clearTimeout(script.timer);
window[callbackName] = null;
params.success && params.success(json);
};
  //发送请求
script.src = params.url + '?' + data;
//为了得知此次请求是否成功,设置超时处理
if(params.time) {
script.timer = setTimeout(function() {
window[callbackName] = null;
head.removeChild(script);
params.error && params.error({
message: '超时'
});
}, time);
}
};
//格式化参数
function formatParams(data) {
var arr = [];
for(var name in data) {
arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
};
// 添加一个随机数,防止缓存
arr.push('v=' + random());
return arr.join('&');
}
// 获取随机数
function random() {
return Math.floor(Math.random() * 10000 + 500);
}
}
/*
// yang.ajax()方法调用与说明
yang.ajax({
url: 'http://localhost:8080/qsurvey/qsexam/findQuestionPage', // 请求地址
jsonp: '', // 如果采用jsonp请求,且回调函数名为"jsonpCallbak",可以设置为合法的字符串;如果是GET或者POST请求则直接省略
data: {
page: 1,
pageSize: 10,
question: '',
deleteFlag: '-1',
stopFlag: '-1',
type: '-1'
}, // 传输数据
success:function(res){ // 请求成功的回调函数
resolve(eval("(" + res + ")").data);
},
error: function(error) { resolve(error); } // 请求失败的回调函数
});
*/
var a = new Promise(function (resolve, reject) {
var url = 'http://localhost:8080/qsurvey/qsexam/findQuestionPage';
yang.ajax({
url: 'http://localhost:8080/qsurvey/qsexam/findQuestionPage', // 请求地址
jsonp: '', // 如果采用jsonp请求,且回调函数名为"jsonpCallbak",可以设置为合法的字符串;如果是GET或者POST请求则直接省略
data: {
page: 1,
pageSize: 10,
question: '',
deleteFlag: '-1',
stopFlag: '-1',
type: '-1'
}, // 传输数据
success:function(res){ // 请求成功的回调函数
resolve(eval("(" + res + ")").data);
},
error: function(error) { resolve(error); } // 请求失败的回调函数
});
});
var b = function (val) {
console.log(val);
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(val.dataList);
}, 2000);
});
}
a.then(b).then(function (val) {
console.log(val);
});
yang.visibility.init(function (v) {
document.title = '进入页面';
if (v == 'visible') {
document.title = '进入页面';
} else if (v == 'hidden') {
document.title = '离开页面';
}
});
Enjoy it ? Donate me ! 欣赏此文?求鼓励,求支持!