ajax详解

1.1XMLHttpRequst对象的概述

  在使用XMLHttpRequest对象发送请求和处理响应之前,必须先调用JavaScript创建一个XMLHttpRequest对象。由于XMLHttpRequest不是一个W3C标准,所以可以采用很多JavaScript方法来创建XMLHttpRequest的实例,IE把XMLHttpRequest实现为一个ActiveX对象,其他浏览器则把它实现为一个本地的JavaScript对象,由于存在这些差别,JavaScript必须包含有关的逻辑,从而使用ActiveX技术与使用本地的JavaScript对象技术创建XMLHttpRequst的一个实例。

  很多人可能还记得从前的那段日子,那时不同浏览器上的JavaScript与DOM简直千差万别,听了这段话后有人可能不寒而栗。幸运的是,在这里为了明确该如何创建XMLHttpRequst对象的实例,并不需要那么详细的编写代码来区别浏览器的类型。你要做的只是检查浏览器是否提供对ActiveX对象的支持。如果浏览器支持ActiveX对象,就可以使用ActiveX对象来创建XMLHttpRequest对象。否则,就要使用本地的JavaScript对象技术来创建。下面的代码展示了编写跨浏览器的JavaScript代码来创建XMLHttpRequst是多么的简单。

  创建XMLHttpRequest的一个实例:

var xmlHttp;

function createXMLHttpRequst(){
      if(window.ActiveXObject){
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");     }
    else if(window.XMLHttpRequst){
      xmlHttp = new XMLHttpRequest();
    } }

   可以看到,创建一个XMLHttpRequest相当容易。首先,要创建一个全局作用域变量xmlHttp来保存这个对象的引用。createXMLHttpRequst方法完成创建XMLHttpRequst对象的具体工作。这个方法中只有简单的分支逻辑(选择逻辑)来确定如何创建对象。对window.ActiveXObject的调用会返回一个对象,也可能返回一个null,if语句会把调用返回的结果看作是true或false(如果返回对象则为true,返回null则为false),以此指示浏览器是否支持ActiveX控件,相应地得知浏览器是不是IE,如果确实是,则通过实例化一个ActiveX的一个新实例来创建XMLHttpRequst对象,并传入一个串指令指示要创建何种类型的ActiveX对象

。在这个例子中为构造函数提供的字符串是Microsoft。XMLHTTP,这说明你想创建一个XMLHttpRequst的一个实例。

  如果window.ActiveXObjec调用失败(返回null),JavaScript就会转到else语句的分支确定浏览器是否把XMLHttpRequst实现为一个本地的JavaScript对象。如果存在window.XMLHttpRequest,就会创建XMLHttpRequst的一个实例。

  由于ajax具有动态类型特性,而且XMLHttpRequst在不同浏览器上的实现是兼容的,所以可以用同样的方式访问XMLHttpRequst实例的属性和方法,而不论这个实例创建的方法是什么。这就大大地简化了开发过程,而且在JavaScript中也不必编写特定于浏览器的逻辑。

1.2方法和属性

  abort()  停止当前请求;

  getAllResponseHeaders()  把HTTP请求的所有响应首部作为键值对返回;

  getResponseHeader("header")  返回指定首部的串值;

  open("method","url")  建立对服务器的调用。method参数可以使GET POST 或PUT。url可以使相对url或绝对url,这个方法还包括三个可选的参数;

  send(content)  向服务器发送请求;

  setRequstHeader("header","value")  把指定首部设置为所提供的值。在设置任何首部之前必须先调用open();

  下面来更详细地讨论这些方法。

  void open(string method, string url, boolean asynch ,string usename ,string password); 这个方法会建立对服务器的调用。这是初始化一个请求的纯脚本方法。它有两个必要的参数三个可选的参数。要提供调用的特定方法(get/post/put),还要提供所调用资源的url。另外还可以传递一个Boolean值,这是这个调用是异步的还是同步的。默认值为true,表示本质上是异步的,如果这个参数为false,处理就会等待,知道服务器返回响应为止。由于异步调用是ajax主要优势之一,所以倘若这个参数设为false,从某种程度上讲与使用XMLHttpRequst对象的初衷不太相符。不过在某些情况下见这个参数设为fals也是有用的,比如持久存储页面之前可以先验证用户的输入。最后两个参数不说自明,允许你指定一个特定的用户名和密码。

  void send(content) 这个方法具体向服务器发送请求。如果请求声明为异步的,这个方法就会立即返回,否则它会等到直到接收到响应为止。可选参数可以是DOM对象的实例、输入流,或串。传入这个方法的内容会作为一个请求体的一部分发送。

  void setRequstHeader(string header,string value);这个方法为为HTTP请求中一个给定的首部设置值,它有两个参数,第一个串表示要设置的首部,第二个串表示要在首部中放置的值。注意,这个方法必须在调用opend()之后才能调用。

  在所有的这些方法中,最有可能用到的就是opend()和send()。XMLHttpRequest对象还有很多属性,在设计Ajax交互时这些属性非常有用。

  void abort() 顾名思义,这个方法就是要停止请求。

  string getAllResponseHeaders() 这个方法的核心功能对开发人员应该很熟悉,它返回一个串,其中包含HTTP请求的所有响应首部,首部包括Content-Length/Data和URI

  string getReponseHeader(string header) 这个方法与getAllResponseHeaders()是对应的,不过它有一个参数表示您希望的指定收不到的值,并把这个值作为串返回。除了这些标准方法,处理XMLHttpRequst可以大量使用这些属性。

  onreadystatechange 每个状态改变时都会触发这个事件处理器,通常会调用一个javacript函数;

  readyState 请求状态。有5个可取的值:0:=未初始化,1=正在加载,2=已加载,3=交互中,4=完成;

  responseText服务器的响应,表示为一个串;

  responseXML服务器的响应,表示为XML,这个对象可解释为DOM对象;

  status服务器HTTP状态码(200对应Ok 404对应 not found ,等)

  statusText HTTP状态码的相应文本(ok或not found等)

1.3AJAX交互设计

  1.一个客户端事件触发一个Ajax事件。从简单的onchange事件到某个特定的用户动作,很多这样的事都可以触发Ajax事件。

<input type="text" d="email" name="email" onblur="validateEmail()"/>

  2.创建XMLHttpRequst对象的一个实例。使用open()方法建立调用,并调用url及所希望的HTTP方法(通常是post/get)。请求实际上是通过一个send()方法调用触发,代码如下:

var xmlHttp;

function validateEmail(){
  var email = document.getElementById("email");
  var url = "validate?email="+escape(email.value);
  if(window.ActiveObject){
    xmlHttp = new ActiveObject("Microsoft.XMLHTTP");
  }
  else if(window.XMLHttpRequst){
    xmlHttp = new XMLHttpRequst();
  }
  xmlHttp.open("get",url);
  xmlHttp.onreadystatechange = callback;
  xmlHttp.send(null);
}

  3.向服务器做出请求。可能调用servlet、CGI脚本,或者任何服务器端技术。

  4.服务器可以做你想做的事情,包括访问时数据库,甚至访问另一个系统。

  5.请求返回到浏览器。content-type设置为text/xml ,XMLHttpRequst的对象只能处理text/html类型的结果。在另外一些更复杂的示例中

  6.在这个demo中,XMLHttpRequst对象配置为处理返回结果时要调用callback()函数,这个函数会检查XMLHttpRequst对象的readyState属性,然后查看服务器返回的状态码。如果一切正常,callback()函数就会在客户端做一些有意思的工作。一下就是一个典型的回调方法:

function callback(){
  if(xmlHttp.readyState == 4){
    if(xmlHttp.status == 200){
      //do something interesting here
    }
  } }

  可以看到,正常的请求/响应模式有所不同,但对于web开发人员来说,并不是完全陌生的。显然,在创建和建立XMLHttpRequst对象时还可以做些事情,另外当“回调”函数完成状态检查之后也可以有所作为。一般的,你会把这些标准调用包装在一个库中,一便在整个应用中使用,或者可以使用web上提供的库

原文地址:https://www.cnblogs.com/yony/p/2554584.html