首先我们来看下面这段代码,通过发送ajax请求得到后台的数据,通过遍历动态生成页面结构
// 1.创建对象
var xhr = new XMLHttpRequest();
// 2.设置请求行
xhr.open("get","./server/nav-json.php");
// 3.设置请求体
xhr.send();
// 4.让异步对象接收服务器响应数据:一个成功的响应包含两个条件:1.服务器成功响应了 2.数据解析完毕可以使用了
xhr.onreadystatechange = function(){
if(xhr.status == 200 && xhr.readyState == 4){
var result = xhr.responseText;
// 在js中通过JSON.parse方法将json格式的字符串转换为js数组或者对象(
// 如果文件以[]来描述数据,那么就转换为数组
// 如果文件以{}来描述数据,那么就转换为对象)
var data = JSON.parse(result);
var html = "";
for(var i=0;i<data.length;i++){
html += "<li>" +
'<a href="#">' +
'<img src="'+data[i].src+'" alt="">' +
'<p>'+data[i].text+'</p>' +
'</a>' +
'</li>';
}
// 将生成的页面结构添加到dom元素中
document.querySelector("ul").innerHTML = html;
}
接下来就对它进行封装,首先找出可变部分作为参数
type:请求方式
url:请求url
data:传递给服务器的参数
callback:客户端的动态结构的渲染方式
function ajax(type,url,data,callback){
// 1.创建对象
var xhr = new XMLHttpRequest();
// 2.设置请求行
xhr.open(type,url,data?url+data:url);
// 3.设置请求体
xhr.send();
// 4.让异步对象接收服务器响应数据:一个成功的响应包含两个条件:1.服务器成功响应了 2.数据解析完毕可以使用了
xhr.onreadystatechange = function(){
if(xhr.status == 200 && xhr.readyState == 4){
// 获取响应头
// getAllResponseHeaders:获取所有响应头
var rh = xhr.getResponseHeader("Content-Type");
var result = xhr.responseText;
// 在js中通过JSON.parse方法将json格式的字符串转换为js数组或者对象(
// 如果文件以[]来描述数据,那么就转换为数组
// 如果文件以{}来描述数据,那么就转换为对象)
callback(result);
}
}
}
// 实现动态结构的渲染
function render(result){
var data = JSON.parse(result);
var html = "";
for(var i=0;i<data.length;i++){
html += "<li>" +
'<a href="#">' +
'<img src="'+data[i].src+'" alt="">' +
'<p>'+data[i].text+'</p>' +
'</a>' +
'</li>';
}
// 将生成的页面结构添加到dom元素中
document.querySelector("ul").innerHTML = html;
}
ajax("get","./server/nav-json.php",null,render);
上面的封装方式的缺点:1.参数数量固定:在调用的时候必须传入四个参数
2.参数的顺序固定:在调用的时候必须按照顺序进行参数的传递
3.不方便后期封装功能的扩展与修改
解决方式:通过传入对象的方式来设置参数
option是一个对象,它里面包含着相关的属性:如type,url,data,success
var $ = {
// 将{"name":"jack","age":20} 从键值对格式转换为 ?name=jack&age=20
getpa:function(data){
if(data && typeof data == "object"){
var str = "?";
for(var key in data){
str = str + key + "=" + data[key] + "&";
}
str = str.substr(0,str.length-1);
}
return str;
},
// option.type:请求方式
// option.url:请求的url
// option.data:当前请求所传递的参数:规定参数必须是以对象的形式传递{"name":"jack","age":20}
// option.success:渲染方式
ajax:function(option){
// 接收用户参数进行相应处理
var type = option.type || 'get';
// location.href 可以获取当前文件的路径
var url = option.url || location.href;
// 接收参数:传递的参数必须是对象
var data = this.getpa(option.data) || "";
// 响应成功之后的回调
var success = option.success;
// 创建异步对象
var xhr = new XMLHttpRequest();
// 让异步对象发送请求
if(type == "get"){
// 拼接参数
url += data;
data = null;
}
xhr.open(type,url);
if(type == "post"){
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
}
xhr.send(data);
// 让异步对象接收响应
xhr.onreadystatechange = function(){
// 一个成功的响应有两个条件:1.服务器成功响应 2.数据解析完毕可以使用
if(xhr.status == 200 && xhr.readyState == 4){
// 接收响应的返回值 responseText responseXML
var rh = xhr.getResponseHeader("Content-Type");
// 判断
if(rh.indexOf("xml") != -1){
var result = xhr.responseXML;
}
else if(rh.lastIndexOf("json") != -1){
var result = JSON.parse(xhr.responseText);
}else{
var result = xhr.responseText;
}
// 接收数据之后,调用回调函数
success && success(result);
}
}
}
}
以上就完成了我们ajax的封装,这种封装方法是比较推荐了,当然了解jQuery的同学应该一眼都看得出来,跟jQuery中ajax的使用方式很相似,不过我们只是简单的封装,并没有像jQuery一样做了大量兼容,以及多方面的考虑,我们的目的只是为了更加熟练地去理解和掌握ajax,在下一节会介绍jQuery中的ajax