关于Ajax的那些记录

今天在复习Ajax,那就顺带把一些关于Ajax的知识点都整合下.

首先我们先来简要讲述下,什么是Ajax.

Ajax,为异步JavaScript和XML.Ajax是一种用于创建快速动态网页的技术,通过在后台服务器进行少量数据交换,Ajax可以使得网页实现异步更新.这也意味着,可以在不重新加载整个页面的情况下,对网页的某个部分进行相应的更新.如果,使用同步提交的话,当用户发送请求时,当前页面就不可使用了,服务器响应页面到客户端,响应完成时,用户才可以使用页面.

那么,要完整实现一个Ajax异步调用与局部刷新,有哪些步骤呢?

1.创建XMLHttpRequest对象,及创建一个异步调用对象

2.创建一个新的HTTP请求,并指定该HTTP请求的方法,URL以及验证消息.

3.设置响应HTTP请求状态变化的函数.

4.发送HTTP请求.
5.获取异步调用返回的数据.

6.使用Javascript与DOM实现局部更新.

接下来,我们对每一个步骤进行一个解述:

一、创建XMLHttpRequest对象

不同浏览器使用的异步调用对象有所不同,在IE浏览器中,异步调用使用的是XMLHTTP组件中的XMLHttpRequest对象,而在Firefox浏览器中,直接使用的是XMLHttpRequest组件,因此,在不同浏览器中创建XMLHttpRequest的方式都有所不同.

在IE浏览器中,创建方式为:

var xmlHttpRequest = new ActiveXobject('Microsoft.XMLHTTP');

在Firefox中,创建方式为:

var xmlHttpRequest  = new XMLHttpRequest()

如果我们明确知道是什么浏览器,那么步骤就如上述选择就好啦,但是有时候我们也不能确定,那这种情况下呢,我们就把两种方式都加上去.

var xmlHttpRequest;//定义一个变量,用于存放xmlHttpRequest对象
create();

function create(){
if(window.ActiveObject){//判断是否为IE浏览器
xmlHttpRequest = new ActiveObject("Microsoft.XMLHTTP");
//创建IE的XMLHttpRequest对象}else if(window.XMLHttpRequest){
xmlHttpRequest = new XMLHttpRequest();
}
}
 

二、创建HTTP请求

创建了XMLHttpRequest对象之后,必须为XMLHttpRequest对象创建HTTP请求,用于说明XMLHttpRequest对象要从哪获取数据,一般是网站中的数据或者为本地中其他文件中的数据.

创建HTTP请求,可以使用XMLHttpRequest对象的open()方法,其语法如下

XMLHttpRequest.open(method,URL,flag,name,password);

挨个来解释下哈:

1.method:该参数用于指定HTTP请求方法,一共有post、get、head、put、delete五种,常用的话就post与get

2.URL:该参数用于指定HTTP请求的URL地址,可以是绝对的也可以是相对的.

3.flag:该参数为可选参数,为布尔值,该参数用于指定是否使用异步方式,默认为true.

4.name:该属性为可选参数,用于输入用户名,若服务器需要验证,则必须使用该参数.

5.password:该参数为可选参数,用于输入密码,若服务器需要验证,则必须使用该参数.

如果访问一个网站文件的内容的话:

xmHttpRequest.open("get","http://www.cnblogs.com/ljylearnsmore")

若是访问本地文件的话:

xmlHttpRequest.open("get","ajax.htm")

三、设置响应HTTP请求状态变化的函数

创建完HTTP请求之后,应该就可以将HTTP请求发送给Web服务器了,然而,发送HTTP请求的目的是为了接收服务器返回的数据.从创建XMLHttpRequest对象开始,到发送数据、接收数据、XMLHttpRequest对象一共会经历以下五种状态:

1.未初始状态.在创建完XMLHttpRequest对象时,该对象处于未初始化状态,此时XMLHttpRequest对象的readyState属性值为0.

2.初始化状态,在创建完XMLHttpRequest对象后,使用open()方法创建HTTP请求时,该对象处于初始化状态,此时XMLHttpRequest的readyState属性值为1.

3.发送数据状态.在初始化XMLHttpRequest对象后,使用send()方法发送数据时,该对象处于发送数据状态,readyState的属性值为2.

4.接收数据状态,web服务器接收完数据并处理完毕后,向客户端传送返回的结果,此时XMLHttpRequest对象处于接收数据状态,readyState的属性值为3.

5.完成状态,XMLHttpRequest对象接收数据完毕后,进入完成状态.此时XMLHttpRequest对象的readyState属性值为4,此时接收完毕后的数据存入在客户端内存中,可以使用response Text属性或者response Xml属性来获取数据.

只有在XMLHttpRequest对象完成了以上五个步骤之后,才可以获取从服务器端返回的数据,因此,如果想获得从服务器端返回的数据,就必须要判断XMLHttpRequest对象的状态.XMLHttpRequest对象可以响应readystatechange事件,该事件在XMLHttpRequest对象状态改变时(即readyState属性改变),激发.因此,可以通过该事件调用一个函数,并在该函数中判断XMLHttpRequest对象的readyState属性值.如果,readyState属性值为4,则使用response Text属性或response Xml属性来获取数据.

//设置当XMLHttpRequest对象状态改变时调用的函数
XMLHttpRequest.onreadystatechange = getData;
//定义函数
function getData(){
//判断XHR对象的readyState属性值是否为4,如果是的话,那么就表示异步调用完成了
if(XMLHttpRequest.readyState==4){
//设置获取数据的语句
}
}

四、设置获取服务器返回数据的语句

若XMLHttpRequest对象的readyState属性值为4,表示异步调用过程已经完毕,就可以通过XMLHttpRequest对象的response Text属性或responseXml属性来获取数据.但是,异步调用过程完毕后,也不代表异步调用就'

成功了,如果要判断异步调用是否成功,还要判断XMLHttpRequest对象的status属性值,只有当其等于200的时候,才表示异步调用成功了.因此要获取数据器返回数据的语句,还必须先判断XMLHttpRequest对象的status属性值是否为200.这里,我们还需要考虑,如果在本地运行,则XMLHttpRequest.status为0,因此我们可按如下代码所写:

XMLHttpRequest.onreadystatechange=getData();
function getData(){
if(XMLHttpRequest.readystate==4){
if(XMLHttpRequest.status==200||XMLHttpRequest.status==0){
document.write(XMLHttpRequest.responseText);
//将返回结果以字符串形式输出
//或者使用responseXml将返回结果以XML形式输出
}
}
}

五、发送HTTP请求

在经历以上几个步骤后,就可以将HTTP请求发送到web服务器上去了,发送HTTP请求可以使用XMLHttpRequest对象的send()方法,其语法代码如下所示:

XMLHttpRequest.send(data);

如果请求数据不需要参数,那就可以用null来代替.如果要传的话,就按照在URL中传递参数的格式来传递:

id-myId&school=mySchool

只有在使用send()方法之后,XMLHttpRequest对象的readyState属性值才会开始改变,才会激发readystatechange事件,并调用函数.

六、局部更新

在通过Ajax的异步调用获得服务器端数据之后,可以调用Javascript或者DOM来将网页中的数据进行局部更新.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>THis is Ajax demo</title>
    <script>
       var xmlHttpRequest;
       //定义一个用于创建XMLHttpRequest对象
       function create(){
           if(window.ActiveXObject){
               xmlHttpRequest =  new ActiveXObject("Microsoft.XMLHTTP");
           }else if(window.xmlHttpRequest){
               xmlHttpRequest = new xmlHttpRequest();
           }
       }
       //响应HTTP请求状态变化的函数
       function httpStatechange(){
           if (xmlHttpRequest.readyState==4){
               if (xmlHttpRequest.status==200||xmlHttpRequest.status==0){
                   var node = document.getElementById('myDiv');//查找节点
                   node.firstChild.nodeValue = xmlHttpRequest.responseText;//更新数据
               }else{//异步调用未成功的时候,弹出警告框,并显示出错信息
                   alert("error:HTTP状态码为:"+xmlHttpRequest.status +"HTTP状态信息为:" + xmlHttpRequest.statusText);

               }
           }
       }

       //异步调用服务器端段数据
       function getData(name,value) {
           createXMLHttpRequest();
           if (xmlHttpRequest != null) {
               xmlHttpRequest.open("get", "ajax.text", true);//创建HTTP请求
               xmlHttpRequest.onreadystatechange = httpStatechange;//HTTP请求状态变化的函数
               xmlHttpRequest.send(null);//发送请求
           }
       }
      </script>
</head>
<body>
<div id="myDiv">原数据</div>
<input type="button" value="更新数据" onclick="getData()">
</body>

接下来,我们再来讲述下Ajax中的get与post的区别:

get一般用于获取数据;如果需要传递参数,那么会默认将参数拼接到url的后面,然后再发送给服务器;其请求传递参数大小是有限制的,浏览器的地址栏也有大小限制.

其安全性会比较低,一般会走缓存,为了防止走缓存,给url后面每次拼的参数不同;放在?后面,一般用个时间戳.

而post的话,一般用于发送数据,post传递参数的话,休要把参数放进请求体中,对大小并无要求;且安全性比较高,请求不会走缓存.

我们再来笼一下,一些ajax的状态码:

200的话,表示请求成功;

301表示永久重定向;

302,表示临时转移;

304,表示读取缓存,即表示浏览器端有缓存,并且服务器未更新,不再向服务端请求资源

307,为临时的重定向

以4开头的话,都是客户端的问题:

400,表示数据/格式错误;

401,即权限不够,比如身份不合格,访问网站的时候,登录与不登录是不一样的

404,即路径错误,找不到文件

以5开头的,都是服务端的问题:

500,即服务器的问题

503,表示超负荷.

原文地址:https://www.cnblogs.com/ljylearnsmore/p/14513398.html