AJAX 基础
一.AJAX 简介
什么是AJAX?
AJAX=异步JavaScript和XML。
AJAX是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。
这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
二.AJAXXHR
1.AJAX-创建XMLHttpRequest对象
XMLHttpRequest是AJAX的基础。
所有现代浏览器均支持XMLHttpRequest对象(IE5和IE6使用ActiveXObject)。
XMLHttpRequest用于在后台与服务器交换数据。
创建XMLHttpRequest对象
所有现代浏览器(IE7+、Firefox、Chrome、Safari以及Opera)均内建XMLHttpRequest对象。
创建XMLHttpRequest对象的语法:
variable=newXMLHttpRequest();
老版本的InternetExplorer(IE5和IE6)使用ActiveX对象:
variable=newActiveXObject("Microsoft.XMLHTTP");
为了应对所有的现代浏览器,包括IE5和IE6,请检查浏览器是否支持XMLHttpRequest对象。
如果支持,则创建XMLHttpRequest对象。如果不支持,则创建ActiveXObject:
varxmlhttp;
if(window.XMLHttpRequest){
//codeforIE7+,Firefox,Chrome,Opera,Safari
xmlhttp=newXMLHttpRequest();
}else{
//codeforIE6,IE5
xmlhttp=newActiveXObject("Microsoft.XMLHTTP");
}
三.AJAX-向服务器发送请求
XMLHttpRequest对象用于和服务器交换数据。
1.向服务器发送请求
如需将请求发送到服务器,我们使用XMLHttpRequest对象的open()和send()方法:
open(method,url,async):规定请求的类型、URL以及是否异步处理请求。
method:请求的类型;GET或POST
url:文件在服务器上的位置
async:true(异步)或false(同步)
send(string):将请求发送到服务器。
string:仅用于POST请求
用法:
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();
2.GET还是POST?
与POST相比,GET更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用POST请求:
无法使用缓存文件(更新服务器上的文件或数据库)
向服务器发送大量数据(POST没有数据量限制)
发送包含未知字符的用户输入时,POST比GET更稳定也更可靠
3.GET请求
为了避免得到的是缓存的结果,向URL添加一个唯一的ID;同时URL可以添加信息:
xmlhttp.open("GET","demo_get.asp?TIMESTAMP="+Math.random(),true);
xmlhttp.send();
4.POST请求
一个简单POST请求:
xmlhttp.open("POST","demo_post.asp",true);
xmlhttp.send();
如果需要像HTML表单那样POST数据,请使用setRequestHeader()来添加HTTP头。然后在send()方法中规定您希望发送的数据:
xmlhttp.open("POST","ajax_test.asp",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Bill&lname=Gates");
setRequestHeader(header,value):向请求添加HTTP头。
header:规定头的名称
value:规定头的值
5.open(method,url,async)-url:服务器上的文件
open()方法的url参数是服务器上文件的地址:
xmlhttp.open("GET","ajax_test.asp",true);
该文件可以是任何类型的文件,比如.txt和.xml,或者服务器脚本文件
6.open(method,url,async)-async异步:True或False?
XMLHttpRequest对象如果要用于AJAX的话,其open()方法的async参数必须设置为true:
xmlhttp.open("GET","some.do",true);
(1)Async=true
当使用async=true时,请规定在响应处于onreadystatechange事件中的就绪状态时执行的函数:
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4&&xmlhttp.status==200){
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();
(2)Async=false
如需使用async=false,请将open()方法中的第三个参数改为false:服务器响应就绪才继续执行
xmlhttp.open("GET","test1.txt",false);
不推荐使用async=false,但是对于一些小型的请求,也是可以的。
请记住,JavaScript会等到服务器响应就绪才继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止。
注释:当您使用async=false时,请不要编写onreadystatechange函数-把代码放到send()语句后面即可:
xmlhttp.open("GET","test1.txt",false);
xmlhttp.send();
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
四.AJAX-服务器响应
如需获得来自服务器的响应,请使用XMLHttpRequest对象的responseText或responseXML属性。
属性描述
responseText获得字符串形式的响应数据。
responseXML获得XML形式的响应数据。
1.responseText属性
如果来自服务器的响应并非XML(比如JSON),请使用responseText属性。
responseText属性返回字符串形式的响应,因此您可以这样使用:
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
2.responseXML属性
如果来自服务器的响应是XML,而且需要作为XML对象进行解析,请使用responseXML属性:
请求books.xml文件,并解析响应:
xmlDoc=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;
五.AJAX-onreadystatechange事件
当请求被发送到服务器时,我们需要执行一些基于响应的任务。
每当readyState改变时,就会触发onreadystatechange事件。
readyState属性存有XMLHttpRequest的状态信息。
1.下面是XMLHttpRequest对象的三个重要的属性:
属性描述
onreadystatechange:存储函数(或函数名),每当readyState属性改变时,就会调用该函数。
readyState:存有XMLHttpRequest的状态。从0到4发生变化。
0:请求未初始化
1:服务器连接已建立
2:请求已接收
3:请求处理中
4:请求已完成,且响应已就绪
status
200:"OK"
404:未找到页面
在onreadystatechange事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。
当readyState等于4且状态为200时,表示响应已就绪:
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4&&xmlhttp.status==200){
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
注释:onreadystatechange事件被触发4次,对应着readyState的每个变化。
案例:AJAX请求JSON的var xmlhttp; if (typeof xmlhttp == "undefined") { if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } } xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { var jsonText = xmlhttp.responseText; var jsonObject = JSON.parse(jsonText); if (!(typeof jsonObject == "object" && Object.prototype.toString.call(jsonObject).toLowerCase() == "[object object]" && !jsonObject.length)) { alert(1); jsonObject = eval("(" + json + ")"); } alert(jsonObject.success); } } xmlhttp.open("GET", "role.do?action=list", true); xmlhttp.send();
2使用Callback函数
callback函数是一种以参数形式传递给另一个函数的函数。
应该为创建XMLHttpRequest对象编写一个标准的函数,并为每个AJAX任务调用该函数。
该函数调用应该包含URL以及发生onreadystatechange事件时执行的任务(每次调用可能不尽相同):
案例var xmlhttp; function loadXMLDoc(url, cfunc) { if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = cfunc; xmlhttp.open("GET", url, true); xmlhttp.send(); } function myFunction() { loadXMLDoc("/ajax/test1.txt", function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { document.getElementById("myDiv").innerHTML = xmlhttp.responseText; } }); }
相关推荐
结束数据方法的参数,该如何定义?-- 集合为自定义实体类中的结合属性,有几个实体类,改变下标就行了。<input id="add" type="button" value="新增visitor&quo