zoukankan      html  css  js  c++  java
  • 关于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,表示超负荷.

  • 相关阅读:
    linux快速安装lamp环境
    linux配置网卡
    给linux添加yum源。
    windows 环境下wamp环境的搭建。
    jQuery知识点总结(第六天)
    LazyLoad学习(一)之无阻塞动态尽可能并行加载脚本文件以及确保执行顺序
    Jquery复习(十)之$的用法
    JavaScript 时间与日期处理
    如何将一个HTML页面嵌套在另一个页面中?
    iframe学习(七)之父窗口的样式会影响子窗口吗?
  • 原文地址:https://www.cnblogs.com/ljylearnsmore/p/14513398.html
Copyright © 2011-2022 走看看