AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。它可以实现在不更新整个页面的情况下,与服务器交换数据更新部份页面的实用功能。
AJAX对象的创建很简单,一条javascript语句就可以完成:
var request = new XMLHttpRequest();
好了,现在已经创建好了一个ajax请求的实例“request”。当然XMLHttpRequest()可能会使人感觉疑惑,不要从字面去理解,据传这是因为当初并没有认为ajax会被如此广泛的使用而随意起的名字,在广泛应用后也就没办法更改了。
IE浏览器在比较老的版本上(IE6往前)是不支持这种方法的,微软在IE7中才开始支持XMLHttpRequest,所以如果你编写的脚本是要运行在比较古老的IE浏览器上时,请用另一种方法建立ajax实例。本文默认以现在使用最广泛的windows7附带的IE8为基础,不考虑之前IE版本的处理。
创建完了之后,就需要开启一个ajax连接了,开启链接的方法是:
request.open(method,url,boolean);
当然,”request”是我们在上一段刚刚创建的实例,它调用的是open方法,这个方法通常需要设置3个参数,分别代表以下含义:
method:指明链接的请求方法,GET或POST;
url:指明请求的服务器端脚本,当使用GET方式时,url中也会带有传递给服务器脚本的参数;
boolean:布尔值,是否使用异步,默认为true异步,false表示同步。
使用open方法建立完链接之后,就需要设置一个类似于监听触发器的东西了,用来在服务器完成请求的处理后返回数据的处理。
request.onreadystatechange = function(){……}
这样就设定了一个等待处理的方法,在ajax请求状态改变的时候就会触发这个函数体。说到这里有一点需要特别说明,那就是ajax的请求状态一共有5种,分别是0-4,具体的含义如下:
0:请求未初始化(open之前)
1:请求已建立,但未发送(send之前)
2:请求已发送,服务器端正在处理中
3:请求处理中,服务器端还未生成响应
4:响应已完成,可以获取到服务器端的响应
浏览器对这些状态的处理并不是完全按照说明进行,有一些状态位直接就被浏览器忽略了(当然它用到的可能性极小极小)。不同的浏览器对这些状态的处理也不一致,有的会有1-4状态位,有的会是2-4状态位,甚至也有3-4状态位的浏览器。所以在设置状态处理的时候,我们直接以状态位4来进行判断,这个状态位是所有浏览器都支持的,不会出现异常错误。
request.onreadystatechange = function(){
if(request.readyState == 4 && request.status == 200){
var tmp = request.responseText;
alert(tmp);
}
}
是不是又发现了一个新的东西,request.status表示的是HTTP状态,状态码200表示一切正常,当这两个条件都满足的时候,你就可以放心的处理服务器端返回的数据了。
最后一个ajax方法是send,作用是向服务器端发送请求,它通常被放在整个ajax流程的最后一步来进行:
request.send();
如果使用的请求方法是GET,那么send方法就不需要参数(当然写个null也是可以的),如果是POST方式,那么send方法中就要指定所要传递给服务器端的参数。
现在一个基本的ajax请求已经完成了,让我们把它封装成个函数一起来看看:
function myAjax(){
var request = new XMLHttpRequest();
var url = "1.php?id=1&name=lucy";
request.open("GET",url,true);
request.onreadystatechange = function(){
if(request.readyState == 4 && request.status == 200){
var tmp = request.responseText;
alert(tmp);
}
}
}
request.send();
AJAX说完了,那就要实践一下,用一个最简单的例子,也不去获取页面的值,直接传送特定的值给服务器端php脚本来进行处理,php脚本名为1.php,HTML头尾部份就不写了。
<script>
function myAjax(){
var request = new XMLHttpRequest();
var url = "1.php?id=1&name=lucy";
request.open("GET",url,true);
request.onreadystatechange = function(){
if(request.readyState == 4 && request.status == 200){
var tmp = request.responseText;
alert(tmp);
}
}
request.send();
}
</script>
<body>
<input type="button" value="click me" onclick="myAjax();" />
</body>
服务器端脚本1.php内容如下:
<?php
$id = $_GET['id'];
$name = $_GET['name'];
if($id == 1 && $name == "lucy"){
$str = "Welcome $name,Your id=$id";
echo $str;
}else{
echo "Input Infos Error!";
}
运行这个简单至极的示例,我们可以获得一个结果,这个示例已经能够说明AJAX的基本运行。
服务器端返回的信息不可以是数组,所以当需要返回的信息比较多的时候,就可以使用json_encode将其转换成json格式的数据返回给AJAX请求;AJAX请求接收到服务器端返回的JSON格式数据后,并不能直接当做JSON格式数据进行处理,还需要进行一次转换,使用eval将返回信息转换成JSON格式数据后再进行处理。
以下是一个简单AJAX处理JSON格式返回数据的例子:
<script>
function getMsg(){
var xmlReq = new XMLHttpRequest();
var url = "1.php?people=HiGoGo";
xmlReq.open("GET",url,true);
xmlReq.onreadystatechange = function(){
if(xmlReq.readyState == 4 && xmlReq.status == 200){
var reptext = xmlReq.responseText;
var tmp = eval ("("+reptext+")");
alert(tmp.address);
}
}
xmlReq.send();
}
</script>
<body>
<input type="button" value="click me" onclick="getMsg();" />
</body>
所请求的服务器端1.php内容:
<?php
$tmp = $_GET['people'];
if($tmp == "HiGoGo"){
$a = array(
'id'=>2001,
'name'=>'ljl',
'sex'=>'man',
'tel'=>186,
'address'=>'huilongguan east',
'birthday'=>'0705'
);
$b = json_encode($a);
echo $b;
}
服务器端返回给AJAX请求的是一串有格式的字符信息,当AJAX请求要将这串信息以JSON格式来进行处理,则先使用javascript的eval方法将返回信息进行处理,然后就可以用对象的方法来使用返回数据中的值了。
1、AJAX是支持多种数据格式的,文本、XML和JSON都支持,相对来说XML的使用范围是比较狭窄的,更多的时候使用的是文本和JSON格式。这两种格式的数据都可以使用responseText来获取,XML格式的数据则需要使用responseXML来进行获取。
2、AJAX可以只获取HTTP头信息,在open方法中不使用GET或POST,使用HEAD,这样服务器返回的就是资源的头信息,获取头信息的方法是getAllResponseHeaders()。
3、当使用POST请求方式时,需要设置一个请求头信息,否则服务器端收不到传送的数据,头信息设置使用方法setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”),可以在open方法后设置。
4、AJAX请求在处理返回的JSON格式数据时,eval(“(“+responseText+”)”)中间的两个括号不能忽略,否则会产生语法错误。