一、参数设计:
options
请求方式:
type : "GET|POST",
请求路径:
url : "路径",
返回类型:
dataType : "text|json",
发送数据:
data : null,
404状态的回调函数:
status
如:
status : {
404 : function(){
}
}
成功的回调函数:
success : function(){
}
错误的回调函数:
error : function(){
}
完成的回调函数:
complete : function(){
}
回调函数的this指向:
context : 回调函数里面this指向的绑定;
设置默认参数:
1 var _default = {
2 type : "GET",
3 url : "",
4 data : null,
5 dataType : "text",
6 status : null,
7 success : function(){},
8 complete : function(){},
9 error : function(){}
10 }
如果用户传入了其他数据会对默认参数进行覆盖
封装代码:
1 function ajax( options ){
2 // 默认参数;
3 var _default = {
4 type : "GET",
5 url : "",
6 data : null,
7 dataType : "text",
8 status : null,
9 success : function(){},
10 complete : function(){},
11 error : function(){}
12 }
13 options = assign( _default , options );
14 options.type = options.type.toLowerCase();
15 // 如果存在context;
16 if( isObject(options.context) ){
17 var callback_list = ["success","complete","error"];
18 callback_list.forEach( function( item ){
19 options[item] = options[item].bind( options.context );
20 })
21 }
22
23 // 1. 创建shr ;
24 var xhr = null;
25 if(typeof XMLHttpRequest === "function"){
26 xhr = new XMLHttpRequest();
27 }else{
28 xhr = new ActiveXObject("Microsoft.XMLHTTP");
29 }
30 // 1. 如果请求方式为get,那么我们把数据拼接到url上;
31 if(options.type === "get"){
32 options.url = toUrlData( options.data , options.url , options.type)
33 }
34 // 2. 如果请求方式为post,那么我们把数据拼接到data上;
35 if(options.type === "post"){
36 options.data = toUrlData( options.data , options.url , options.type)
37 }
38 // 2. 根据数据进行方法的调用;
39 xhr.open( options.type , options.url , true ) ;
40 options.type === "post" ? xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded") : "";
41 // 3. 调用send方法;
42 xhr.send( options.type=== "get" ? null : options.data );
43 // 4. 调用回调函数;
44 xhr.onreadystatechange = function(){
45 // xhr程序运行结束;
46 if( xhr.readyState === 4 ){
47 options.complete();
48 if( /^2\d{2}$/.test(xhr.status) ){
49 // 5.传递数据
50 // 如果需要转换成json那么我们就返回json,如果不需要原样返回;
51 // 如果JSON.parse报错了那么我们要调用错误函数;
52 try{
53 var res = options.dataType === "json" ? JSON.parse(xhr.responseText) : xhr.responseText;
54 options.success(res);
55 }catch(e){
56 options.error(e,xhr.status);
57 }
58 }else{
59 options.error("error",xhr.status);
60 }
61 // 策略模式调用 :
62 if( isObject(options.status) ){
63 typeof options.status[xhr.status] === "function" ? options.status[xhr.status]() : "";
64 }
65 }
66 }
67 }
封装内部使用的方法:
合并对象:
function assign(){
var target = arguments[0];
for(var i = 1 ; i < arguments.length ; i ++){
for(var attr in arguments[i]){
target[attr] = arguments[i][attr];
}
}
return target;
}
URL按请求方式处理:
function toUrlData( obj , url , method){
if( isObject(obj) ){
var str = "";
for(var attr in obj){
str += "&" + attr + "=" + obj[attr]
}
str = str.slice(1);
method = method || "";
if( method.toUpperCase() === "POST"){
return str;
}
url += "?" + str;
return url;
}
return url;
}
判断类型:
function isObject( data ){
return (typeof data === "object" && data !== null && data.constructor && data.constructor === Object)
}
来源:https://www.cnblogs.com/homeathere/p/12596236.html