ajax请求是异步的,因此可以通过回调函数来处理响应

实现ajax请求大多是使用XMLHttpRequest对象,该对象用于与服务器交互,可以在不刷新页面的情况下请求url,获取数据,从而达到更新页面内容的目的

初始化XMLHttpRequest()构造函数,可以获得一个XMLHttpReques实例,例如:

var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function(){
    if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
        document.getElementById("app").innerHTML = xmlhttp.responseText
    }
}
console.log(xmlhttp.readyState) // 0
xmlhttp.open("GET","https://httpbin.org/get",true)
console.log(xmlhttp.readyState) // 1
xmlhttp.onprogress =function(){
    console.log(xmlhttp.readyState) // 3
}
xmlhttp.onload = function(){
    console.log(xmlhttp.readyState) // 4
}
xmlhttp.send();

XMLHttpReques实例的属性

XMLHttpRequest.readyState:该属性会返回一个XMLHttpRequest的状态,状态有5种,例如:

状态0:已被实例化,但是未调用open()方法 状态1:open()方法已被调用(连接) 状态2:send()方法已被调用(请求) 状态3:请求处理中 状态4:请求完毕,且响应已就绪

XMLHttpReques.onreadystatechange:该属性对应了一个回调函数,当XMLHttpRequest.readyState属性发生改变时,该回调函数就会被调用,例子如上面所示

XMLHttpRequest.response:该属性会返回一个类型,该类型取决于XMLHttpRequest.responseType的值,类型例如:

DOMString:当XMLHttpRequest.responseType的值为空字符串,那么就是DOMString类型(是一个utf-16字符串,默认)

arraybuffer:XMLHttpRequest.responseType的值为存储二进制数据的ArrayBuffer对象(该对象是用于存储二进制数据,不能直接进行操作,只能通过视图来进行操作)

Blob:XMLHttpRequest.responseType的值为包含二进制数据的Blob对象(该对象是用于表示一个类似文件的对象,可以通过二进制的方式进行读取)

Document:值是一个Document

json:值是一个JavaScript对象

text:值是一个DOMString对象表示的文本(utf-16字符串)

XMLHttpRequest.responseText:该属性的值是请求被发送到服务端后,从服务端返回的文本,如果值为null,那么就是请求失败,如果为空字符串,那么就是没有send()

XMLHttpRequest.responseType:该属性会返回一个值,该值和response属性的值一样

XMLHttpRequest.responseURL:该属性会返回一个序列化url,如果url为空那么就返回空字符串

XMLHttpRequest.responseXML:该属性返回Document(html/xml),如果请求没有成功或者获取的数据,无法解析为html或者xml,那么为null

XMLHttpRequest.status:该属性会返回响应中的http状态码,如果请求没有完成,那么值为0,如果出错也是为0

XMLHttpRequest.timeout:该属性会返回一个值,该值为请求被自动终止前所消耗的毫秒数(默认为0,则表示没有超时)

XMLHttpRequest.upload:该属性是用于表示上传的进度,可搭配事件监听器来追踪进度,例如:

onloadstart:开始获取数据 onprogress:数据正在传输中 onabort:数据获取终止 onerror:数据获取失败 onload:数据获取成功 ontimeout:数据获取操作在规定的时间内未完成 onloadend:数据获取完成(不管是否成功)


open()方法

该方法有3个常用参数,请求方式,请求url,是否异步执行(如果为false,那么JavaScript会等到服务器响应完毕时才会继续执行)

xmlhttp.open(“GET”,“https://httpbin.org/get",true)