摘要:本文主要学习了AJAX的原理和使用。
1 简介
AJAX是异步的JS和XML,即:Asynchronous JavaScript And XML。
AJAX的目的是在不发生页面跳转的情况下,使用异步载入内容并改写页面内容的技术。
AJAX可以简单的理解为通过JS向服务器发送请求。
AJAX这门技术很早就被发明,但是直到2005年被谷歌的大量使用,才在市场中流行起来,可以说Google为AJAX的推广起到到推波助澜的作用。
2 同步和异步
2.1 同步处理
在AJAX出现之前,访问互联网时一般都是同步请求,也就是当一个页面向服务器发送一个请求时,在服务器响应结束之前,整个页面是不能操作的,直观上来看是卡住的或者是正在加载中的。
这就带来了非常糟糕的用户体验。首先,同步请求时,用户只能等待服务器的响应,而不能做任何操作。其次,如果请求时间过长可能会给用户一个卡死的感觉。最后,同步请求的最大缺点,就是即使整个页面中只有一小部分内容发生改变也要刷新整个页面。
2.2 异步处理
异步处理指的是在浏览网页的同时,通过AJAX向服务器发送请求,发送请求的过程中浏览网页的行为并不会收到任何影响,甚至主观上感知不到在向服务器发送请求。当服务器正常响应请求后,响应信息会直接发送到AJAX中,AJAX可以根据服务器响应的内容做一些操作。
使用AJAX的异步请求基本上完美的解决了同步请求带来的问题。首先,发送请求时不会影响到用户的正常访问。其次,即使请求时间过长,用户不会有任何感知。最后,AJAX可以根据服务器的响应信息局部的修改页面,而不需要整个页面刷新。
3 工作原理
3.1 XMLHttpRequest对象
如果需要向服务器发送请求,就需要使用Http协议,需要通过JS向服务器发送一个请求报文。
浏览器为开发人员提供了XMLHttpRequest对象,用于封装请求报文,浏览器向服务器发送的请求信息全部都需要封装到该对象中。
3.2 获取XMLHttpRequest对象
由于浏览器之间的差异,不同浏览器中获取XMLHttpRequest的方式不同,但总的来说一共有三种方式:
1 | var xhr = new XMLHttpRequest();//目前主流浏览器都支持 |
使用兼容方式获取XMLHttpRequest对象:
1 | function createXMLHttpRequest(){ |
3.3 使用XMLHttpRequest对象
3.3.1 发送请求
如果需要将请求发送到服务器,可以使用XMLHttpRequest对象的open方法和send方法。
- 使用open方法规定请求的类型、URL以及是否异步处理请求。
格式:
1 | open(method,url,async) |
参数:
- method:发送请求的HTTP类型(GET,POST,PUT,DELETE),必须大写。
- uri:XMLHttpRequest对象把请求发送到的服务器相应的URI。
- async:是否请求是异步的,缺省值为true(异步)。
- 使用send方法将请求发送到服务器。
格式:
1 | send(string) |
参数:
- string:仅用于POST请求,并且POST请求在发送数据之前还需要设置请求头。
3.3.2 获取响应
如果要获取服务器的响应,需要使用responseText或者responseXML属性。
如果响应返回的数据是文本就使用responseText,如果响应返回的数据是XML就使用responseXML。
状态相关的属性有readyState和status:
- readyState描述XMLHttpRequest对象的状态,从0到4变化:
- 0表示未初始化,XMLHttpRequest对象已创建,但还未初始化。
- 1表示服务器连接已建立。
- 2表示请求已接收,响应未接收。
- 3表示响应正在接收。
- 4表示响应已接收。
- status描述HTTP状态码,当且仅当readyStatus的值为3或4时,这个属性才可以用:
- 200表示一切正常(ok)
- 304表示没有被修改(not modified)
- 403表示禁止访问(forbidden)
- 404表示没找到页面(not found)
- 500表示内部服务器出错(internal service error)
每当readyState的值发生改变,XMLHttpRequest对象就会激发一个readystatechange事件,可以在readystatechange事件中设置回调。
3.4 举例
使用GET方式:
1 | var xhr = getXMLHttpRequest(); |
使用POST方式:
1 | var xhr = getXMLHttpRequest(); |
4 JQuery对AJAX的封装
JQuery中提供了一些方法,封装了原生的AJAX。
4.1 get方法
格式:
1 | jQuery.get(url, [data], [callback], [type]) |
参数:
- url:发送请求的URL地址。
- data:发送到服务器的数据,支持
k=v&k=v
字符串和{k:v,k:v}
对象两种格式。 - callback:载入成功时回调函数。
- type:预期服务器返回的数据类型,支持xml、html、script、json、text、_default等类型。
举例:
1 | $.get('${pageContext.request.contextPath}/getPassword', |
4.2 post方法
格式:
1 | jQuery.post(url, [data], [callback], [type]) |
参数:
- url:发送请求的URL地址。
- data:发送到服务器的数据,支持
k=v&k=v
字符串和{k:v,k:v}
对象两种格式。 - callback:载入成功时回调函数。
- type:预期服务器返回的数据类型,支持xml、html、script、json、text、_default等类型。
举例:
1 | $.post('${pageContext.request.contextPath}/getPassword', |
4.3 底层方法
封装好的get方法和post方法可扩展性差,不能实现定制化开发,所以JQuery提供了底层的方法。
格式:
1 | jQuery.ajax(url,[settings]) |
参数:
- url:发送请求的url地址。
- type:请求方式,POST或者GET,默认GET。
- async:请求是同步(true)还是异步(false),默认是true(同步)。
- cache:是否缓存页面,默认是true(缓存)。
- data:发送到服务器的数据,支持
k=v&k=v
字符串和{k:v,k:v}
对象两种格式。 - dataType:预期服务器返回的数据类型,支持xml、html、script、json、text、_default等类型。
- success:请求成功时的回调函数。
- error:请求失败时的回调函数。
- complete:请求完成后的回调函数,成功或失败之后都会调用。
- statusCode:一组数值的HTTP代码和函数对象,当响应时调用了相应的代码。
举例:
1 | $.ajax({ |
条