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;
        }
    });
}
 

相关推荐