视频
实现网页的动态展示。刷新网页中的部分页面内容,又不引起整个页面的刷新。
let xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.onreadystatechange = function () {
if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){
var text = xmlHttpRequest.responseText;//服务器返回的字符串
console.log(text)
//ToDo
}
}
//GET请求发送数据:getText="/资源路径?key1=value&key2=value"
xmlHttpRequest.open("GET",getText,true);
xmlHttpRequest.send();
let xmlHttpRequest = new XMLHttpRequest();
onreadystatechange
xmlHttpRequest.readyState
返回0-4,5个值,代表xmlHttpRequest
对象的5种不同状态:
0:xmlHttpRequest
对象的未初始化状态。这个值检测不到;
1:xmlHttpRequest
对象使用open方法,创建了Http请求;
2:xmlHttpRequest
对象使用send方法,处于发送数据状态;
3: 客户端已经返回数据,xmlHttpRequest
对象正在接收数据的状态;
4:数据接收完毕
xmlHttpRequest.status
返回响应状态码,200表示响应成功
xmlHttpRequest.responseText
返回Response响应的字符串。
xmlHttpRequest.onreadystatechange = function () {
if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){
var text = xmlHttpRequest.responseText;//服务器返回的字符串
//ToDo
}
}
XMLHttpRequest.open(method,URL,flag,name,password);
同步:在第4步发送请求之后,必须等待服务器将数据返回,在此期间不能执行其他任务。
异步:在第4步发送请求之后,执行其他任务,无需等待数据返回。
xmlHttpRequest.open("get",getText,true);
xmlHttpRequest.send();
与GET请求有两个不同的地方
xmlHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8")
xmlHttpRequest.send("key1=value&key2=value");
application/json
xhr.setRequestHeader("Content-type","application/json; charset=utf-8");
application/x-www-form-urlencoded
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
multipart/form-data
xhr.setRequestHeader("Content-type", "multipart/form-data; charset=utf-8");
text/xml
xhr.setRequestHeader("Content-type", "text/xml; charset=utf-8");
服务器返回的数据都是字符串格式,处理方法:
var jsonObj = eval('('+jsonStr+')');//将json字符串jsonStr转换为jasn对象
var value = jsonObj.key1;//返回json对象中键值为key1的值
var jsonObj = JSON.parse(jsonStr);//将json字符串jsonStr转换为jasn对象
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding(‘UTF-8’);//解决请求乱码
response.setContentType("text/html;charset=UTF-8");//解决响应乱码
详细的讲解
第一种:(参数最少的写法)
$.ajax({
url:"路径",
data: {
id: 1,
},
success:function (data) {
$.each(data,function (i,n) {
// each可以循环json格式的字符串,i为index,n为json的数据,取值:n.name
})
}
})
$.each(data,function (i,n)的参数:
i
是key,n
是valuei
是下标,n
是data[i]
参数名 | 类型 | 描述 |
---|---|---|
url | String | (默认: 当前页地址) 发送请求的地址。 |
type | String | (默认: “GET”) 请求方式 (“POST” 或 “GET”), 默认为 “GET”。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。 |
async | Boolean | (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。 |
contentType | String | (默认: “application/x-www-form-urlencoded”) 发送信息至服务器时内容编码类型。默认值适合大多数应用场合。告诉服务器从浏览器提交过来的数据格式。 |
data | Object、String | 发送到服务器的数据。json格式 |
dataType | String | 预期服务器返回的数据类型。json、string |
error | Function | (默认: 自动判断 (xml 或 html)) 请求失败时将调用此方法。这个方法有三个参数:XMLHttpRequest 对象,错误信息,(可能)捕获的错误对象。 |
success | Function | 请求成功后回调函数。这个方法有两个参数:服务器返回数据,返回状态 |
beforeSend | Function | 请求发起前执行 |
complete | Function | 请求完成后执行,无论成功与否 |
默认数据格式为json,可省略,get请求最简化写法:
$.get("路径",function(返回的数据){ 执行代码 })
参数名称 | 类型 | 说明 |
---|---|---|
url | String | 请求HTML页的URL地址 |
data(可选) | Object | 发送到服务器的key/value数据会作为字符串附加到请求的URL中 |
callback(可选) | Function | 请求成功时的回调函数,有两个参数:返回的数据,请求状态 |
type(可选) | String | 服务器返回内容的格式:xml、html、script、json、text、default |
Ajax发送跨域请求时会被浏览器的同源策略(CORS)阻止,这是浏览器的安全策略。
总结:实现跨域请求必须服务器端配合,浏览器端无法单独实现跨域请求
示例
a站点:http://localhost:8080/a/
b站点:http://localhost:8081/b/
从a站点发送跨域请求到b站点,浏览器报错:
Access to XMLHttpRequest at 'http://localhost:8081/b/hello' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
什么是同源?
协议一致、域名一致、端口号一致。
要访问的资源允许跨域访问。
//允许某个站点可以对本地资源跨域访问
response.setHeader("Access-Control-Allow-Origin","http://localhost:8080");
// 允许所有站点可以对本地资源跨域访问
response.setHeader("Access-Control-Allow-Origin","*");