Ajax详细讲解及实例
一、XMLHttpRequest的方法
abort(): 停止发送当前请求。
getAllResponseHeaders(): 获取服务器返回的全部响应头;以 CRLF 分割的字符串,或者null
如果没有收到任何响应。
如:
date: Fri, 08 Dec 2017 21:04:30 GMT
content-encoding: gzip
x-content-type-options: nosniff
server: meinheld/0.6.1
x-frame-options: DENY
content-type: text/html; charset=utf-8
getResponseHeader(): 返回包含指定响应头的字符串,如果响应尚未收到或响应中不存在该报头,则返回null
。
open("method","URL"[,asyncFlag[,"username"[,"password"]]]):建立与服务器URL的链接,并设置请求和方法,以及是否使用异步请求。
如果远程服务需要用户名、密码,则提供对于的用户名和密码
send(content): 发送请求。其中content是请求参数。
setRequestHeader("label","value"): 在发送请求之前,先设置请求头。
二、XMLHttpRequest的属性
onreadystatechange:该属性用于指定XMLHttpRequest对象状态改变时的事件处理函数。
readyState:XMLHttpRequest对象的处理状态。状态每次变更都会触发onreadystatechange指定的方法被触发
0:代理被创建,但尚未调用 open() 方法。
1:open()
方法已经被调用。
2:send()
方法已经被调用,并且头部和状态已经可获得。
3.下载中;responseText
属性已经包含部分数据。
4.下载操作已完成。
responseText: 该属性用于获取服务器的响应文本。
responseXML: 该属性用于获取服务器响应的XML文档对象。
status: 该属性是服务器返回的状态码,只有当服务器的响应已经完成时,才会有该状态码。
服务器常用状态码如下:
200:服务器响应正常。
304:该资源在上次请求之后没有任何修改,这通常用于浏览器的缓存机制。使用GET请求时尤其需要注意。
400:无法找到请求的资源。
401:访问资源的权限不够。
403:没有权限访问资源。
404:需要访问的资源不存在。
405:需要访问的资源被禁止。
407:访问的资源需要代理身份验证。
414:请求的URL太长。
500:服务器内部错误。
statusText: 该属性是服务器返回的状态文本信息,只有当服务器的响应已经完成时,才会有该状态文本信息。
三、简单实现ajax请求
/** * Created by xxc on 2021/3/28 * 封装ajax函数 * @param {string}opt.type http连接的方式,包括POST和GET两种方式 * @param {string}opt.url 发送请求的url * @param {boolean}opt.async 是否为异步请求,true为异步的,false为同步的 * @param {object}opt.data 发送的参数,格式为对象类型 * @param {function}opt.success ajax发送并接收成功调用的回调函数 */ function ajax(opt) { opt = opt || {}; opt.type = opt.type.toUpperCase() || 'GET'; opt.url = opt.url || ''; opt.async = opt.async || true; opt.data = opt.data || null; opt.success = opt.success || function () { }; var xmlHttp = null; if (XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } else { try{ xmlHttp = new ActiveXObject('Microsoft.XMLHTTP'); }catch (e) { try{ xmlHttp = new ActiveXObject('Msxml12.XMLHTTP'); }catch (e) { } } } var params = []; for (var key in opt.data) { params.push(key + '=' + opt.data[key]); } var postData = params.join('&'); if (opt.type.toUpperCase() === 'POST') { xmlHttp.open(opt.type.toUpperCase(), opt.url, opt.async); // 如果使用formdata 上传文件 不设置请求头 if (opt.contentType !== 'multipart/form-data') { xmlHttp.setRequestHeader('Content-Type', opt.contentType || 'application/x-www-form-urlencoded;charset=utf-8'); } xmlHttp.send(postData); } else if (opt.type.toUpperCase() === 'GET') { xmlHttp.open(opt.type, opt.url + '?' + postData, opt.async); xmlHttp.send(null); } xmlHttp.onreadystatechange = function () { if(xmlHttp.readyState == 4){ if (xmlHttp.status == 200) { var returnData = opt.dataType == 'json' ? JSON.parse(xmlHttp.responseText) : xmlHttp.responseXML; ; opt.success(returnData); } else { if (opt.error) { var returnData = opt.dataType == 'json' ? JSON.parse(xmlHttp.responseText) : xmlHttp.responseXML; ; opt.error(returnData); } } } } } /*使用示例*/ /* ajax({ url:'http://www.baidu.com', type:"post", async:true, contentType:'multipart/form-data', dataType:"json/xml", data:{username:'xxx',password:'123456'}, success:function (data) { console.log(data) },error:function(res){ console.log(res); } }) */