jQuery - 初探ajax
在学习jQuery中AJAX的时候 , 看到文档中那么多参数 ,一眼望去还是有点吓人的 , 不过理解了用原生JS封装实现ajax , 就可以比较轻松的理解了
原生JS封装AJAX
<script> function ajax(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(); //回调函数里面this指向的绑定; if(isObject(options.context)){ var callback_list = ["success" , "complete" , "error"]; callback_list.forEach(function(item){ options[item] = options[item].bind(options.context) }) } var xhr = null; if(typeof XMLHttpRequest === "function"){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHTTP"); } // 判断传输数据的类型 // 如果数据的传输类型是get , 则把数据拼接到URL上 if(options.type === "get"){ options.url = toUrlData(options.data , options.url , options.type) } // 如果数据的传输类型是post , 则把数据拼接到data上 if(options.type === "post"){ options.data = toUrlData(options.data , options.url , options.type) } xhr.open(options.type.toUpperCase() , options.url , true); //判断是否post传送方式 , 设置请求头 options.type === "post" ? xhr.setRequestHeader("Content-type" , "application/x-www-form-urlencoded") :""; // 调用send方法 xhr.send(options.type === "get" ? null : options.data); xhr.onreadystatechange = function(){ if(xhr.readyState === 4){ options.complete(); if(/^2\d{2}$/.test(xhr.status)){ // 传递数据 , 如果需要转换成json就转化 , 不需要则原样返回 // 如果json报错 ,我们就调用错误函数 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]() : ""; } } }
//合并对象函数 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); // 如果数据发送方式是POST,那么直接返回str就可以了; method = method || ""; if( method.toUpperCase() === "POST"){ return str; } url += "?" + str; return url; } return url; } //判断是不是对象 function isObject( data ){ console.log(data.constructor) return (typeof data === "object" && data !== null && data.constructor && data.constructor === Object) }
//设置传递的参数 var options = { url : "./data.php", data : { a : 2 , b : 4 }, type : "post", success : function(res){ console.log(res , this) }, error : function(res){ console.log("失败" , res) }, complete : function(res){ console.log("完成") }, context : {ddd : 1}, status : { 404 : function(){ console.log("我找不到页面了") }, 200 : function(){ console.log("我的状态码是200,非常正常"); } } }
//调用ajax ajax(options) </script>
看完了上面用原生JS封装实现AJAX ,下面看看jQuery中的ajax
jQuery中的AJAX
jQuery中ajax有三种写法
写法一:$.getJSON $.getScript 容易使用但是可定制性差
$.getJSON("./06_data.php" , {data : "hello world"} , function(res){ console.log(res) })
// 默认把请求回来的数据当成JS执行
$.getScript("./06_data.js" , function(res){ console.log(res) })
写法二:load $.get $.post :存在一定的可配置能力
$("header").load("./06_data.html" , function(){ // 对元素的操作一定要放在回调函数里面 $("header").children().css({ color : "#f99" }) }) $.get("./06_data.php" , {data : "get请求"} , function(res){ console.log(res) } , "json")
写法三 :$.ajax :可以随意配置 , 同时支持jsonp
$.ajax({ url : "./06_data.php" , data : {data : "hello world"}, dataType : "json", success : function(res){ console.log(res) } })
$.ajax("./06_data.php" , {
type : "get",
dataType : "html",
success : function(res){
console.log(res)
}
})
//随意配置 , 使用参数
$.ajax({
url : "./07_data.php",
data : {a : 10 , b : 20},
type : "GET",
dataType : "json",
context : {name : "my context"},
status : {
404 : function(){
},
500 : function(){
}
}
});
看完这些 ,有没有发现jQuery中写法三的和原生封装的JS很像呢 , 看懂了原生JS的封装 , 就可以很轻易的理解jq中ajax的参数使用了
一起加油吧~