Asynchronous JavaScript and XML
用JavaScript执行异步网络请求
产生:
过程:
AJAX包括以下几个步骤:
XMLHttpRequest对象
用来在浏览器与服务器之间传送数据。
var ajax = new XMLHttpRequest();
ajax.open('GET', 'http://www.example.com/page.php', true);
// 向指定的服务器网址,发出GET请求。
// open方法的第三个参数是一个布尔值,表示是否为异步请求。如果设为false,就表示这个请求是同步的
然后,AJAX指定回调函数,监听通信状态(readyState
属性)的变化。
ajax.onreadystatechange = handleStateChange;
readyState
表示XMLHttpRequest请求当前所处的状态。
readyState === 4
表示整个请求过程已完毕
onreadystatechange
指向回调函数,监听通信状态(readyState
属性)的变化。
response
返回接收到的数据体
responseType
指定服务器返回数据(xhr.response)的类型。
responseText
返回从服务器接收到的字符串,如果本次请求没有成功或者数据不完整,该属性就会等于null
。
var data = ajax.responseText;
data = JSON.parse(data);
responseXML
返回从服务器接收到的Document对象
status
表示本次请求所得到的HTTP状态码,基本上,只有2xx和304的状态码,表示服务器返回是正常状态。
if (ajax.readyState == 4) {
if ( (ajax.status >= 200 && ajax.status < 300)
|| (ajax.status == 304) ) {
// Handle the response.
} else {
// Status error!
}
}
具体状态码对应的意思见HTTP知识一章
statusText
返回一个字符串,表示服务器发送的状态提示。
abort()
用来终止已经发出的HTTP请求
open()
用于指定发送HTTP请求的参数
open(method,url,async)
send()
发出HTTP请求
不带参数,就表示HTTP请求只包含头信息,也就是只有一个URL,典型例子就是GET请求。
带有参数,就表示除了头信息,还带有包含具体数据的信息体,典型例子就是POST请求。
// 发送POST请求
var data = 'email='
+ encodeURIComponent(email)
+ '&password='
+ encodeURIComponent(password);
ajax.open('POST', 'http://www.example.com/somepage.php', true);
ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
ajax.send(data);
getResponseHeader()
返回HTTP头信息指定字段的值
getAllResponseHeaders()
返回服务器发来的所有HTTP头信息
setRequestHeader()
设置HTTP头信息。该方法必须在open()之后、send()之前调用。
readyStateChange事件
readyState属性的值发生改变,就会触发readyStateChange事件。
可以通过onReadyStateChange属性,指定这个事件的回调函数
原生JS发送AJAX
let request = new XMLHttpRequest();
request.open('GET','/xxx');
request.send();
request.onreadystatechange = ()=>{
if(request.readyState === 4){
if ( (ajax.status >= 200 && ajax.status < 300)
|| (ajax.status == 304) ){
var string = request.responseText;
var value = JSON.parse(string);
}
}
}
jQuery实现AJAX
$(selector).load(URL,data,callback);
// 必需的 URL 参数规定您希望加载的 URL。
// 可选的 data 参数规定与请求一同发送的查询字符串键/值对集合。
// 可选的 callback 参数是 load() 方法完成后所执行的函数名称。
示例:文件 “demo_test.txt” 的内容加载到指定的 实例: 实例: 跨域资源共享 CORS 详解 但是,AJAX可以通过CORS发送请求到别的网站。 CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源。 跨域能否成功,取决于对方服务器是否愿意给你设置一个正确的$("#div1").load("demo_test.txt",function(responseTxt,statusTxt,xhr){
if(statusTxt=="success")
alert("外部内容加载成功!");
if(statusTxt=="error")
alert("Error: "+xhr.status+": "+xhr.statusText);
});
// responseTxt - 包含调用成功时的结果内容
// statusTXT - 包含调用的状态
// xhr - 包含 XMLHttpRequest 对象
通过 HTTP GET 请求从服务器上请求数据。 $.get(URL,callback);
$.get("demo_test.php",function(data,status){
alert("数据: " + data + "\n状态: " + status);
});
// 第一个回调参数存有被请求页面的内容
// 第二个回调参数存有请求的状态。
通过 HTTP POST 请求向服务器提交数据。$.post(URL,data,callback);
$.post("/try/ajax/demo_test_post.php",
{
name:"菜鸟教程",
url:"http://www.runoob.com"
},
function(data,status){
alert("数据: \n" + data + "\n状态: " + status);
});
// 必需的 URL 参数规定您希望请求的 URL。
// 可选的 data 参数规定连同请求发送的数据。
// "demo_test_post.php" 中的 PHP 脚本读取这些参数,对它们进行处理,然后返回结果。
// 第一个回调参数存有被请求页面的内容
// 第二个参数存有请求的状态
跨域策略CORS
AJAX只能向同源网址(协议、域名、端口都相同)发出HTTP请求,如果发出跨源请求,就会报错。因为AJAX是可以获取响应内容的,如果没有同源策略的限制,别的网站可以通过AJAX获取另一个网站的所有信息。Access-Control-Allow-Origin
如果设置了response.setHeader('Access-Control-Allow-Origin', 'http://pyz.com:8888')
http://pyz.com:8888
是我的协议+域名+端口号,这样我就可以访问他的服务器了,即使我们域名不同。如果该字段为*
,则表示这个服务器可以接受所有网站的AJAX请求。