ajax基本原理及工作流程

1.Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写

Ajax 应用程序所用到的基本技术:
HTML 用于建立 Web 表单并确定应用程序其他部分使用的字段。 
JavaScript 代码是运行 Ajax 应用程序的核心代码,帮助改进与服务器应用程序的通信。 

DHTML 或 Dynamic HTML,用于动态更新表单。我们将使用 div、span 和其他动态 HTML 元素来标记 HTML。 文档对象模型 DOM 用于(通过 JavaScript 代码)处理 HTML 结构和(某些情况下)服务器返回的 XML。

从上面可以看出,Ajax不是什么新的技术,而是几个老的技术通过新的方法结合起来,从而实现了新的效果!很多事物都是多元化的,可以说Ajax是一个新技术,也可以说Ajax是一个新的思路,一个新的架构

2. Ajax的基本工作原理:

Ajax 基本上就是把 JavaScript 技术和 XMLHttpRequest 对象放在 Web 表单和服务器之间。当用户填写表单时,数据发送给一些 JavaScript 代码而不是 直接发送给服务器。相反,JavaScript 代码捕获表单数据并向服务器发送请求。同时用户屏幕上的表单也不会闪烁、消失或延迟。换句话说,JavaScript 代码在幕后发送请求,用户甚至不知道请求的发出。更好的是,请求是异步发送的,就是说 JavaScript 代码(和用户)不用等待服务器的响应。因此用户可以继续输入数据、滚动屏幕和使用应用程序。然后,服务器将数据返回 JavaScript 代码(仍然在 Web 表单中),后者决定如何处理这些数据。它可以迅速更新表单数据,让人感觉应用程序是立即完成的,表单没有提交或刷新而用户得到了新数据。JavaScript 代码甚至可以对收到的数据执行某种计算,再发送另一个请求,完全不需要用户干预!这就是XMLHttpRequest 的强大之处。它可以根据需要自行与服务器进行交互,用户甚至可以完全不知道幕后发生的一切。结果就是类似于桌面应用程序的动态、快速响应、高交互性的体验,但是背后又拥有互联网的全部强大力量。

3. XMLHttpRequest 对象:

open():建立到服务器的新请求。 

send():向服务器发送请求.

abort():退出当前请求。 

readyState:提供当前 HTML 的就绪状态。 

responseText:服务器返回的请求响应文本。 

由于前两年的浏览器大战,使得各种浏览器获得 XMLHttpRequest 对象采用的方法有所不同。

支持多种浏览器的方式创建 XMLHttpRequest 对象

4. Ajax中的请求/响应

发出请求:Ajax 应用程序中基本相同的流程:
1. 从 Web 表单中获取需要的数据。 
2. 建立要连接的 URL。 
3. 打开到服务器的连接。 
4. 设置服务器在完成后要运行的函数。 
5. 发送请求。

5. 处理响应:

readyState可能返回的值:

0:请求未初始化(还没有调用 open())。 

1:请求已经建立,但是还没有发送(还没有调用 send())。 

2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)。 

3:请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。 

4:响应已完成;您可以获取并使用服务器的响应了。 

必须知道两点:

1.什么也不要做,直到 xmlHttp.readyState 属性的值等于 4。 

2.服务器将把响应填充到 xmlHttp.responseText 属性中

 

6. 简单总结的Ajax的工作流程:

javascript获得要向服务器段传递的参数或变量,然后利用创建的XMLHttpRequest 对象发送给服务器段,如果服务器端接受数据并返回数据,则保存在responseText 属性中,最后通过javascript修改DOM,从而实现在客户端无刷新的修改数据。

返回的数据类型为:XML

具体流程:

对象初始化->发送请求->服务器接收->服务器返回->客户端接收->修改客户端页面内容

6.1对象初始化

由于各个浏览器对XMLHttpRequest对象的支持存在差异,这种差异主要体现在各个浏览器对这个对象的创建方式上。根据浏览器对XMLHttpRequest对象的支持的方式不同,可以将浏览器分为两大阵营:第一个阵营是IE5,IE6浏览器;第二个阵营是IE7以上,FireFox,Opera,Safari等浏览器。幸运的是,这两类浏览器仅仅只是在创建XMLHttpRequest对象时的方式不同,创建了XMLHttpRequest对象之后,其余代码则兼容各类浏览器。

第一阵营创建方式:

var  oHttp = new ActiveXObject(“Microsoft.XMLHttp”);

此方法创建了一个最低版本的XMLHttpRequest对象。Microsoft的XMLHttpRequest对象具有多个不同的版本,但是Microsoft建议采用下列版本之一的XMLHttpRequest对象:

MSXML2.XmlHttp.6.0

MSXML2.XmlHttp.3.0

最新版本的XMLHttpRequest对象不仅包含了对上一版本中bug的修正,还具有更好的执行性能,因此,当我们创建一个XMLHttpRequest对象时,总是希望创建最新版本的XMLHttpRequest对象。

第二阵营创建方式:

var  oHttp = new XMLHttpRequest();

XMLHttpRequest对象与版本无关,要创建XMLHttpRequest对象,只需调用XMLHttpRequest的构造函数,就可以创建当前浏览器支持的XMLHttpRequest对象。

如此,XMLHttpRequest对象的创建就变得比较复杂,因为你不知道客户端浏览器是何种版本。

鉴于此情况,我们可以创建一个方法,用于创建XMLHttpRequest对象。

//通过prototype给类HttpRequest添加方法
HttpRequest.prototype.createXmlHttpRequest = function(){
    if(window.XMLHttpRequest){
        var oHttp = new XMLHttpRequest();
        return oHttp;
    }else if(window.ActiveXObject){
        var versions = ["MSXML2.XmlHttp.6.0","MSXML2.XmlHttp.3.0"];
        for(var i=0;i<versions.length;i++){
            try{
                var oHttp = new ActiveXObject(versions[i]);
                return oHttp;
            }catch(error){
                //do nothing here
            }
        }
    }
    return null;
}
HttpRequest.prototype.send = function(){
    this.request.send(null);
}

指定响应处理函数。指定当服务器返回信息时客户端的处理方式,相应的处理函数名称赋给XMLHttpRequest 对象的onreadystatechange属性。例如:

httpRequest.onreadystatechange = request_readystatechange;

6.2发送请求

发出HTTP 请求。指定响应处理函数之后,就可以向服务器发出HTTP 请求。这一步调用XMLHttpRequest 对象的open 和send 方法。

httpRequest.open('GET','http://www.example.org/some.php',true);

httpRequest.send(null);

open 的第一个参数是HTTP 请求的方法,为GET或POST。

open 的第二个参数是目标URL。open 的第三个参数如果为True:异步请求;false:同步请求。默认为True

6.3服务器接收

6.4服务器返回

返回的数据类型为:XML

6.5客户端接受

处理服务器返回的信息。首先,它要检查XMLHttpRequest 对象的readyState 值,判断请求的当前状态。

服务器返回信息后,还需要判断返回的HTTP 状态码,确定返回的页面没有错误。所有的状态码都可以在W3C 的官方网站上查到。其中,200 代表页面正常。

function HttpRequest(sUrl,fpCallback){
    this.request = this.createXmlHttpRequest();
    this.request.open("GET",sUrl,true);
    var tempRequest = this.request;
    function request_readystatechange(){
        if(tempRequest.readyState == 4){
            if(tempRequest.status == 200){
                fpCallback(tempRequest.responseText);
            }else{
                document.write("获取数据失败");
            }
        }else{
            //alert("连接失败");
        }
    }
    this.request.onreadystatechange = request_readystatechange;
}

6.6修改客户端页面内容

7.封装XMLHttpRequest类

封装一个类,用来完成XMLHttpRequest对象的创建及信息的发送,这样,异步求情将变得很简单。需要异步请求时,只需实例化一个该类的对象即可。

代码如下:

/**************************封装XMLHttpRequest类*****************************/ 
function HttpRequest(sUrl,fpCallback){
    this.request = this.createXmlHttpRequest();
    this.request.open("GET",sUrl,true);
    var tempRequest = this.request;
    function request_readystatechange(){
        if(tempRequest.readyState == 4){
            if(tempRequest.status == 200){
                fpCallback(tempRequest.responseText);
            }else{
                document.write("获取数据失败");
            }
        }else{
            //alert("连接失败");
        }
    }
    this.request.onreadystatechange = request_readystatechange;
}
//通过prototype给类HttpRequest添加方法
HttpRequest.prototype.createXmlHttpRequest = function(){
    if(window.XMLHttpRequest){
        var oHttp = new XMLHttpRequest();
        return oHttp;
    }else if(window.ActiveXObject){
        var versions = ["MSXML2.XmlHttp.6.0","MSXML2.XmlHttp.3.0"];
        for(var i=0;i<versions.length;i++){
            try{
                var oHttp = new ActiveXObject(versions[i]);
                return oHttp;
            }catch(error){
                //do nothing here
            }
        }
    }
    return null;
}
HttpRequest.prototype.send = function(){
    this.request.send(null);
}
/**************************封装XMLHttpRequest类*****************************/ 

// 例如:
function checkUsername(sRequestText){
    // 客户端处理代码.. 修改客户端页面内容
    // 注:sRequestText是一个XML类型的数据
}
var username=document.registerForm.username.value;//获取用户名
//异步请求
var url = "http://localhost/zhida/ajaxUsername.php?username="+username;
    //创建一个HttpRequest对象,传递一个URL和一个方法名
var ajaxRequest = new HttpRequest(url,checkUsername);
ajaxRequest.send();
8.返回的是请求页面上输出的内容,并以XML文档的形式存储。

你可能感兴趣的:(Ajax,Ajax工作原理,Ajax工作流程)