同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式 。
- Flash
- 框架Frameset:如果使用一组框架构造了一个网页,可以只更新其中一个框架,而不必惊动整个页面
- XMLHttpRequest:该对象是对 JavaScript 的一个扩展,可使网页与服务器进行通信。是创建 Ajax 应用的最佳选择。实际上通常把 Ajax 当成XMLHttpRequest(XHR) 对象的代名词
1,Ajax的工作原理
-
AJAX采用异步交互过程。AJAX在用户与服务器之间引入一个中间媒介,从而消除了网络交互过程中的处理—等待—处理—等待缺点。
-
用户的浏览器在执行任务时即装载了AJAX引擎。AJAX引擎用JavaScript语言编写,通常藏在一个隐藏的框架中。它负责编译用户界面及与服务器之间的交互。
-
AJAX引擎允许用户与应用软件之间的交互过程异步进行,独立于用户与网络服务器间的交流。现在,可以用javascript调用AJAX引擎来代替产生一个HTTP的用户动作,内存中的数据编辑、页面导航、数据校验这些不需要重新载入整个页面的需求可以交给AJAX来执行。
2,AJAX的缺陷
- AJAX大量使用了JavaScript和AJAX引擎,而这个取决于浏览器的支持。IE5.0及以上、Mozilla1.0、NetScape7及以上版本才支持,Mozilla虽然也支持AJAX,但是提供XMLHttpRequest的方式不一样。所以,使用AJAX的程序必须测试针对各个浏览器的兼容性。
- AJAX更新页面内容的时候并没有刷新整个页面,因此,网页的后退功能是失效的;有的用户还经常搞不清楚现在的数据是旧的还是已经更新过的。这个就需要在明显位置提醒用户“数据已更新”。
- 对流媒体的支持没有FLASH好。
- 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax。
3,创建AJAX引擎对象的两种不同方式
第一种:
- function createXHR(){
- var xhr =null;
- try{
- xhr = new ActiveXObject("microsoft.xmlhttp");
- }catch (e) {
- try{
- xhr = new XMLHttpRequest();
- }catch(e){
- alert("浏览器太差了,敢接卸载了吧");
- }
- }
- return xhr;
- }
第二种:
- function createXHR(){
- var xhr=null;
- if(window.ActiveXObject){
- xhr= new ActiveXObject("microsoft.xmlhttp");
- }else{
- xhr = new XMLHttpRequest();
- }
- return xhr;
- }
4,使用AJAX
核心函数:当出发js事件时出发的函数
- function checkValue(){
- //创建ajax引擎对象
- var xhr = createXHR();
- //用于存储返回信息
- var msg="";
- //创建ajax状态监听
- xhr.onreadystatechange=function(){
- if(xhr.readyState==4){
- if(xhr.status==200){
- //接受返回字符串
- msg = xhr.responseText;
- //使用返回的字符串信息
- document.getElementById("result").innerHTML=msg;
- }
- }
- };
- var username = document.getElementsByName("username")[0].value;
- //准备以POST方式发送请求
- xhr.open("post","/day31/CheckServlet?time="+new Date().getTime());
- //设置请求头,只有是POST方式下,才设置该请求头
- xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");
- //设置为 post时,就可以在send函数中添加参数列表。当为get时,下面的send中参数为null。
- xhr.send("username="+username);
- }
在url中添加time参数 是因为在某些情况下,有些浏览器会把多个XMLHttpRequest请求的结果缓存在同一个URL。如果对每个请求的响应不同,这就会带来不好的结果。把当前时间戳追加到URL的最后,就能确保URL的惟一性,从而避免浏览器缓存结果 onreadystatechange:状态改变的事件触发器。readyState:对象状态
0:未初始化
1:读取中
2:已读取
3:交互中
4:完成
responseText:返回的文本版本
responseXML:返回数据的兼容DOM的XML文档对象
status:服务器返回的状态码:如:404:文件未找到、200:成功
使用XMLHttpRequest实例与服务器交互的的3个关键部分:
- onreadystatechange 事件处理函数 :
该事件是由服务器触发的,而不是用户。在执行ajax的过程中,服务器同志当前客户端的通讯状态,(即改变XMLHttpRequest对象的readState来实现)。服务端每次改变客户端的通讯状态都会触发onreadystatechange事件。
- open(method, url, asynch)
前台通过XMLHttpRequest对象的open方法向服务器端发送请求。
method:请求类型,类似“GET”或”POST”的字符串。若只想从服务器检索一个文件,而不需要发送任何数据,使用GET(可以在GET请求里通过附加在URL上的查询字符串来发送数据,不过数据大小限制为2000个字符)。若需要向服务器发送数据,用POST。url:路径字符串,指向你所请求的服务器上的那个文件。可以是绝对路径或相对路径。asynch:表示请求是否要异步传输,默认值为true(异步)。指定true,在读取后面的脚本之前,不需要等待服务器的相应。指定false,当脚本处理过程经过这点时,会停下来,一直等到Ajax请求执行完毕再继续执行。
- send(data)
•open 方法定义了 Ajax 请求的一些细节。send 方法可为已经待命的请求发送指令•data:将要传递给服务器的字符串。•若选用的是 GET 请求,则不会发送任何数据,给 send 方法传递 null 即可:request.send(null);•当向send()方法提供参数时,要确保open()中指定的方法是POST,如果没有数据作为请求体的一部分发送,则使用null.
5,Ajax的服务端程序
在ajax的服务端主要使用: response.getWriter().write(msg);来返回ajax的返回信息。
但是在执行该函数之前必须要指定返回的是什么类型的信息:
1,resp.setContentType("text/html;charset=utf-8"); 说明返回的是文本文件
2,response.setContentType("text/xml;charset=utf-8");说明返回的是xml文件
如何使用ajax?
第一步,创建xmlhttprequest对象,var xmlhttp =new XMLHttpRequest();XMLHttpRequest对象用来和服务器交换数据。
1
2
3
4
5
6
7
8
|
var xhttp; if (window.XMLHttpRequest) { //现代主流浏览器 xhttp = new XMLHttpRequest(); } else { // 针对浏览器,比如IE5或IE6 xhttp = new ActiveXObject( "Microsoft.XMLHTTP" ); } |
第二步,使用xmlhttprequest对象的open()和send()方法发送资源请求给服务器。
xmlhttp.open(method,url,async) method包括get 和post,url主要是文件或资源的路径,async参数为true(代表异步)或者false(代表同步)
xhttp.send();使用get方法发送请求到服务器。
xhttp.send(string);使用post方法发送请求到服务器。
post 发送请求什么时候能够使用呢?
(1)更新一个文件或者数据库的时候。
(2)发送大量数据到服务器,因为post请求没有字符限制。
(3)发送用户输入的加密数据。
get例子:
1
2
3
|
xhttp.open( "GET" , "ajax_info.txt" , true ); xhttp.open( "GET" , "index.html" , true ); xhttp.open( "GET" , "demo_get.asp?t=" + Math.random(), true );xhttp.send(); |
post例子
1
2
|
xhttp.open( "POST" , "demo_post.asp" , true ); xhttp.send(); |
post表单数据需要使用xmlhttprequest对象的setRequestHeader方法增加一个HTTP头。
post表单例子
1
2
3
|
xhttp.open( "POST" , "ajax_test.aspx" , true ); xhttp.setRequestHeader( "Content-type" , "application/x-www-form-urlencoded" ); xhttp.send( "fname=Henry&lname=Ford" ); |
async=true 当服务器准备响应时将执行onreadystatechange函数。
1
2
3
4
5
6
7
|
xhttp.onreadystatechange = function () { if (xhttp.readyState == 4 && xhttp.status == 200) { document.getElementById( "demo" ).innerHTML = xhttp.responseText; } }; xhttp.open( "GET" , "index.aspx" , true ); xhttp.send(); |
asyn=false 则将不需要写onreadystatechange函数,直接在send后面写上执行代码。
1
2
3
|
xhttp.open( "GET" , "index.aspx" , false ); xhttp.send(); document.getElementById( "demo" ).innerHTML = xhttp.responseText; |
第三步,使用xmlhttprequest对象的responseText或responseXML属性获得服务器的响应。
使用responseText属性得到服务器响应的字符串数据,使用responseXML属性得到服务器响应的XML数据。
例子如下:
1
|
document.getElementById( "demo" ).innerHTML = xhttp.responseText; |
服务器响应的XML数据需要使用XML对象进行转换。
例子:
1
2
3
4
5
6
7
|
xmlDoc = xhttp.responseXML; txt = "" ; x = xmlDoc.getElementsByTagName( "ARTIST" ); for (i = 0; i < x.length; i++) { txt += x[i].childNodes[0].nodeValue + "<br>" ; } document.getElementById( "demo" ).innerHTML = txt; |
第四步,onreadystatechange函数,当发送请求到服务器,我们想要服务器响应执行一些功能就需要使用onreadystatechange函数,每次xmlhttprequest对象的readyState发生改变都会触发onreadystatechange函数。
onreadystatechange属性存储一个当readyState发生改变时自动被调用的函数。
readyState属性,XMLHttpRequest对象的状态,改变从0到4,0代表请求未被初始化,1代表服务器连接成功,2请求被服务器接收,3处理请求,4请求完成并且响应准备。
status属性,200表示成功响应,404表示页面不存在。
在onreadystatechange事件中,服务器响应准备的时候发生,当readyState==4和status==200的时候服务器响应准备。
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
function loadDoc() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (xhttp.readyState == 4 && xhttp.status == 200) { document.getElementById( "demo" ).innerHTML = xhttp.responseText; } }; xhttp.open( "GET" , "ajax_info.txt" , true ); xhttp.send(); } //函数作为参数调用 <!DOCTYPE html> <html> <body> <p id= "demo" >Let AJAX change this text.</p> <button type= "button" onclick= "loadDoc('index.aspx', myFunction)" >Change Content </button> <script> function loadDoc(url, cfunc) { var xhttp; xhttp= new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (xhttp.readyState == 4 && xhttp.status == 200) { cfunc(xhttp); } }; xhttp.open( "GET" , url, true ); xhttp.send(); } function myFunction(xhttp) { document.getElementById( "demo" ).innerHTML = xhttp.responseText; } </script> </body> </html> |
以上所述是小编给大家介绍的Ajax的使用四大步骤,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
原文链接:http://www.cnblogs.com/Hackerman/p/5648389.html?utm_source=tuicool&utm_medium=referral