什么是 AJAX ?
- AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),意思就是用JavaScript执行异步网络请求。
- AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
- AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。
- 用JavaScript写一个完整的AJAX代码并不复杂,但是需要注意:AJAX请求是异步执行的,也就是说,要通过回调函数获得响应。
- 在现代浏览器上写AJAX主要依靠XMLHttpRequest对象
步骤
- 创建XMLHttpRequest对象:通过检测window对象是否有XMLHttpRequest属性来判断浏览器是否支持标准的XMLHttpRequest,创建XMLHttpRequest对象(不支持则创建ActiveXObject对象)。
- 判断对象状态:通过XMLHttpRequest的onreadystatechange事件(以及readyState还有status属性)判断对象状态(请求是否初始化、服务器连接是否建立、请求是否接收、请求是否处理中、请求是否已完成且响应已就绪)。
- 获取响应数据:判断到“请求已完成且响应已就绪”时可使用XMLHttpRequest 对象的 responseText 或 responseXML 属性来获得响应数据。
- 向服务器发送请求:使用XMLHttpRequest 对象(或者ActiveXObject对象)的 open() 和 send() 方法向服务器发送请求。
1 | <html> |
使用多个AJAX任务的步骤
- 如果您的网站上存在多个 AJAX 任务,那么您应该为创建 XMLHttpRequest 对象编写一个标准的函数,并为每个 AJAX 任务调用该函数。
- 该函数调用应该包含 URL (发送请求时open方法的参数url)以及发生 onreadystatechange 事件(发生状态变化)时执行的任务(每次调用可能不尽相同)
1 | <html> |
AJAX 的基础:XMLHttpRequest()
- XMLHttpRequest 对象用于和服务器交换数据。
创建 XMLHttpRequest 对象
- 所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。
- 但是老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象.
- 所以为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject :
1
2
3
4
5
6
7
8
9var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();//创建 XMLHttpRequest 对象
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");//创建ActiveX 对象
} - 通过检测window对象是否有XMLHttpRequest属性来确定浏览器是否支持标准的XMLHttpRequest。注意,不要根据浏览器的navigator.userAgent来检测浏览器是否支持某个JavaScript特性,一是因为这个字符串本身可以伪造,二是通过IE版本判断JavaScript特性将非常复杂。
向服务器发送请求
- 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:
1
2xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();
方法 | 描述 |
---|---|
open(method,url,async) | 规定请求的类型、URL 以及是否异步处理请求。 method:请求的类型,GET 或 POST url:文件在服务器上的位置 async:true(异步)或 false(同步),默认true,可不写 |
send(string) | 将请求发送到服务器。 string:仅用于 POST 请求 |
- 最后调用send()方法才真正发送请求。GET请求不需要参数,POST请求需要把body部分以字符串或者FormData对象传进去。
- 注意,千万不要把第三个参数指定为false,否则浏览器将停止响应,直到AJAX请求完成。如果这个请求耗时10秒,那么10秒内你会发现浏览器处于“假死”状态。
GET 还是 POST?
- 与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。
- 然而,在以下情况中,请使用 POST 请求:
- 无法使用缓存文件(更新服务器上的文件或数据库)
- 向服务器发送大量数据(POST 没有数据量限制)
- 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
- 注意区分:表单中的method属性值默认GET,推荐使用 POST(更加安全)。
- GET请求不需要参数,POST请求需要把body部分以字符串或者FormData对象传进去。
服务器响应
如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。
属性 | 描述 |
---|---|
responseText | 获得字符串形式的响应数据 |
responseXML | 获得 XML 形式的响应数据 |
responseText属性
1 | document.getElementById("myDiv").innerHTML=xmlhttp.responseText; |
responseXML 属性
- 如果来自服务器的响应是 XML,而且需要作为 XML 对象进行解析,请使用 responseXML 属性:
- 请求 books.xml 文件,并解析响应:
1
2
3
4
5
6
7
8xmlDoc=xmlhttp.responseXML;
txt="";
x=xmlDoc.getElementsByTagName("ARTIST");
for (i=0;i<x.length;i++)
{
txt=txt + x[i].childNodes[0].nodeValue + "<br />";
}
document.getElementById("myDiv").innerHTML=txt; - 完整例子
onreadystatechange 事件
- 每当 readyState 改变时(即XMLHttpRequest对象的状态发生变化时),就会触发 onreadystatechange 事件。
- 类似image对象的onload事件和onerror事件。
- readyState 属性存有 XMLHttpRequest 的状态信息。
- 下面是XMLHttpRequest 对象的三个重要的属性:
属性 | 描述 |
---|---|
onreadystatechange | 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。 |
readyState | 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接收 3: 请求处理中 4: 请求已完成,且响应已就绪 |
status | 200: “OK” ;404: 未找到页面 |
- 在 onreadystatechange 事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。
- 当 readyState 等于 4 且状态为 200 时,表示响应已就绪。
使用 Callback 函数
- callback 函数是一种以参数形式传递给另一个函数的函数。
- 如果您的网站上存在多个 AJAX 任务,那么您应该为创建 XMLHttpRequest 对象编写一个标准的函数,并为每个 AJAX 任务调用该函数。
- 该函数调用应该包含 URL (发送请求时open方法的参数url)以及发生 onreadystatechange 事件(发生状态变化)时执行的任务(每次调用可能不尽相同)
- 函数调用:
1
2
3
4
5
6
7
8
9
10
11function myFunction()
{
//调用标准函数,把url传入并编写标准函数中的cfunc(即:每当readyState 属性改变时会调用的函数)
loadXMLDoc("/ajax/test1.txt",function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
});
} - 被调用的标准的函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17function loadXMLDoc(url,cfunc)
{
//判断是否含有XMLHttpRequest属性,创建对象
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
//每当 readyState 属性改变时,就会调用onreadystatechange(也就是cfunc)
xmlhttp.onreadystatechange=cfunc;
//向服务器发送请求
xmlhttp.open("GET",url,true);
xmlhttp.send();
} - 例子
jQuery中的ajax方法
注意:HTTP请求的类型不止GET和POST,还有PUT、PATCH、DELETE
$.ajax()
执行异步 AJAX 请求
- ajax() 方法用于执行 AJAX(异步 HTTP)请求。
- 所有的 jQuery AJAX 方法都使用 ajax() 方法。该方法通常用于其他方法不能完成的请求。
- 语法:
$.ajax({name:value, name:value, ... })
- 返回值:一个Promise对象
- 该参数规定 AJAX 请求的一个或多个名称/值对。
url:规定发送请求的 URL。默认是当前页面。
success(result,status,xhr):当请求成功时运行的函数。 - 更多参数可参考菜鸟教程
- 例子
$.get()
使用 AJAX 的 HTTP GET 请求从服务器加载数据
$.get()
方法使用 HTTP GET 请求从服务器加载数据。- 语法:
$.get(URL,data,function(data,status,xhr),dataType)
- 返回值:一个Promise对象
- 例子
$.post()
使用 AJAX 的 HTTP POST 请求从服务器加载数据
$.post()
方法使用 HTTP POST 请求从服务器加载数据.- 语法:
$(selector).post(URL,data,function(data,status,xhr),dataType)
- 返回值:一个Promise对象
- 例子
中断ajax请求
XMLHttpRequest.abort()
- 可参考MDN 文档
jquery ajax abort()
- 可参考这篇文章