Ajax封装的原理,ajax原理及封装

functionassign(){var target = arguments[0];for(var i = 1 ; i < arguments.length ; i ++){//console.log(arguments[i]);

for(var attr inarguments[i]){

target[attr]=arguments[i][attr];

}

}returntarget;

}functiontoUrlData( obj , url , method){if( isObject(obj) ){var str = "";for(var attr inobj){

str+= "&" + attr + "=" +obj[attr]

}

str= str.slice(1);//如果数据发送方式是POST,那么直接返回str就可以了;

method = method || "";if( method.toUpperCase() === "POST"){returnstr;

}

url+= "?" +str;returnurl;

}returnurl;

}functionisObject( data ){return (typeof data === "object" && data !== null && data.constructor && data.constructor ===Object)

}functionajax( options ){var _default ={

type :"GET",

url :"",

data :null,

dataType :"text",

status :null,

success :function(){},

complete :function(){},

error :function(){}

}//我们会创建一些默认参数, 如果用户传入了其他数据会对默认参数进行覆盖;

options =assign( _default , options );

options.type=options.type.toLowerCase();if( isObject(options.context) ){var callback_list = ["success","complete","error"];

callback_list.forEach(function( item ){//console.log(options[item]);

options[item] =options[item].bind( options.context );

})

}//1. 创建shr ;

var xhr = null;if(typeof XMLHttpRequest === "function"){

xhr= newXMLHttpRequest();

}else{

xhr= new ActiveXObject("Microsoft.XMLHTTP");

}//1. 如果请求方式为get,那么我们把数据拼接到url上;

if(options.type === "get"){

options.url=toUrlData( options.data , options.url , options.type)

}//2. 如果请求方式为post,那么我们把数据拼接到data上;

if(options.type === "post"){

options.data=toUrlData( options.data , options.url , options.type)

}//2. 根据数据进行方法的调用;

xhr.open( options.type , options.url , true) ;

options.type=== "post" ? xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded") : "";//3. 调用send方法;

xhr.send( options.type=== "get" ? null: options.data );//4. 调用回调函数;

xhr.onreadystatechange = function(){//xhr程序运行结束;

if( xhr.readyState === 4){

options.complete();if( /^2\d{2}$/.test(xhr.status) ){//5.传递数据

try{var res = options.dataType === "json" ?JSON.parse(xhr.responseText) : xhr.responseText;

options.success(res);

}catch(e){

options.error(e,xhr.status);

}

}else{

options.error("error",xhr.status);

}//策略模式调用 :

if( isObject(options.status) ){typeof options.status[xhr.status] === "function" ? options.status[xhr.status]() : "";

}

}

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值