`
yeahfeng
  • 浏览: 16485 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

【转】实现AJAX的基本步骤

    博客分类:
  • AJAX
阅读更多

要完整实现一个AJAX异步调用和局部刷新,通常需要以下几个步骤:
      (1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.

      (2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.

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

      (4)发送HTTP请求.

      (5)获取异步调用返回的数据.

      (6)使用JavaScript和DOM实现局部刷新.

1、创建XMLHttpRequest对象

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

    在IE浏览器中创建XMLHttpRequest对象的方式如下所示:

    var xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");

    在Netscape浏览器中创建XMLHttpRequest对象的方式如下所示:

    var xmlHttpRequest = new XMLHttpRequest();

    由于无法确定用户使用的是什么浏览器,所以在创建XMLHttpRequest对象时,最好将以上两种方法都加上.如以下代码所示:

<html>

           <head>

                         <title>创建XMLHttpRequest对象</title>

                         <script language = "javascript" type = "text/javascript">

                         <!--

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

                                function createXMLHttpRequest()    //创建XMLHttpRequest对象的方法

                               {

                                         if(window.ActiveXObject)   //判断是否是IE浏览器

                                        {

                                                  xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");  //创建IE浏览器中的XMLHttpRequest对象

                                        }

                                        else if(window.XMLHttpRequest)    //判断是否是Netscape等其他支持XMLHttpRequest组件的浏览器

                                        {

                                        xmlHttpRequest = new XMLHttpRequest();  //创建其他浏览器上的XMLHttpRequest对象

                                         }

                               }

                         -->

                         </script>

                         createXMLHttpRequst();   //调用创建对象的方法

           </head>

           <body>

           </body>

</html>

      "if(window.ActiveXObject)"用来判断是否使用IE浏览器.其中ActiveXOject并不是Windows对象的标准属性,而是IE浏览器中专有的属性,可以用于判断浏览器是否支持ActiveX控件.通常只有IE浏览器或以IE浏览器为核心的浏览器才能支持Active控件.

      "else if(window.XMLHttpRequest)"是为了防止一些浏览器既不支持ActiveX控件,也不支持XMLHttpRequest组件而进行的判断.其中XMLHttpRequest也不是window对象的标准属性,但可以用来判断浏览器是否支持XMLHttpRequest组件.

      如果浏览器既不支持ActiveX控件,也不支持XMLHttpRequest组件,那么就不会对xmlHttpRequest变量赋值.

2、创建HTTP请求

       创建了XMLHttpRequest对象之后,必须为XMLHttpRequest对象创建HTTP请求,用于说明XMLHttpRequest对象要从哪里获取数据.通常可以是网站中的数据,也可以是本地中其他文件中的数据.

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

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

       代码中的参数解释如下所示:

       method:该参数用于指定HTTP的请求方法,一共有get、post、head、put、delete五种方法,常用的方法为get和post。

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

       flag:该参数为可选参数,参数值为布尔型。该参数用于指定是否使用异步方式。true表示异步方式、false表示同步方式,默认为true。

       name:该参数为可选参数,用于输入用户名。如果服务器需要验证,则必须使用该参数。

       password:该参数为可选参数,用于输入密码。如果服务器需要验证,则必须使用该参数。通常可以使用以下代码来访问一个网站文件的内容。

       xmlHttpRequest.open("get","http://www.aspxfans.com/BookSupport/JavaScript/ajax.htm",true);

       或者使用以下代码来访问一个本地文件内容:

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

注意:如果HTML文件放在Web服务器上,在Netscape浏览器中的JavaScript安全机制不允许与本机之外的主机进行通信。也就是说,使用open()方法只能打开与HTML文件在同一个服务器上的文件。而在IE浏览器中则无此限制(虽然可以打开其他服务器上的文件,但也会有警告提示)。

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

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

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

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

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

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

       ⑸完成状态。XMLHttpRequest对象接收数据完毕后,进入完成状态,此时XMLHttpRequest对象的readyState属性值为4。此时接收完毕后的数据存入在客户端计算机的内存中,可以使用responseText属性或responseXml属性来获取数据。

        只有在XMLHttpRequest对象完成了以上5个步骤之后,才可以获取从服务器端返回的数据。因此,如果要获得从服务器端返回的数据,就必须要先判断XMLHttpRequest对象的状态。

       XMLHttpRequest对象可以响应readystatechange事件,该事件在XMLHttpRequest对象状态改变时(也就是readyState属性值改变时)激发。因此,可以通过该事件调用一个函数,并在该函数中判断XMLHttpRequest对象的readyState属性值。如果readyState属性值为4则使用responseText属性或responseXml属性来获取数据。具体代码如下所示:

       //设置当XMLHttpRequest对象状态改变时调用的函数,注意函数名后面不要添加小括号

       xmlHttpRequest.onreadystatechange = getData;

       //定义函数

       function getData()

       {

              //判断XMLHttpRequest对象的readyState属性值是否为4,如果为4表示异步调用完成

              if(xmlHttpRequest.readyState == 4)

              {

                          //设置获取数据的语句

               }

        }

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

       如果XMLHttpRequest对象的readyState属性值等于4,表示异步调用过程完毕,就可以通过XMLHttpRequest对象的responseText属性或responseXml属性来获取数据。

       但是,异步调用过程完毕,并不代表异步调用成功了,如果要判断异步调用是否成功,还要判断XMLHttpRequest对象的status属性值,只有该属性值为200,才表示异步调用成功,因此,要获取服务器返回数据的语句,还必须要先判断XMLHttpRequest对象的status属性值是否等于200,如以下代码所示:

       if(xmlHttpRequst.status == 200)

       {

                //使用以下语句将返回结果以字符串形式输出

                document.write(xmlHttpRequest.responseText);

                //或者使用以下语句将返回结果以XML形式输出

                //document.write(xmlHttpRequest.responseXML);

       }

       注意:如果HTML文件不是在Web服务器上运行,而是在本地运行,则xmlHttpRequest.status的返回值为0。因此,如果该文件在本地运行,则应该加上xmlHttpRequest.status == 0的判断。

        通常将以上代码放在响应HTTP请求状态变化的函数体内,如以下代码所示:

       //设置当XMLHttpRequest对象状态改变时调用的函数,注意函数名后面不要添加小括号

       xmlHttpRequest.onreadystatechange = getData;

       //定义函数

       function getData()

       {

               //判断XMLHttpRequest对象的readyState属性值是否为4,如果为4表示异步调用完成

                if(xmlHttpRequest.readyState==4)

                {

                       //设置获取数据的语句

                       if(xmlHttpRequest.status == 200 || xmlHttpRequest.status == 0)

                       {

                               //使用以下语句将返回结果以字符串形式输出

                               document.write(xmlHttpRequest.responseText);

                               //或者使用以下语句将返回结果以XML形式输出

                               //docunment.write(xmlHttpRequest.responseXML);

                       }

                }

       }

5、发送HTTP请求

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

       XMLHttpRequest.send(data)

       其中data是个可选参数,如果请求的数据不需要参数,即可以使用null来替代。data参数的格式与在URL中传递参数的格式类似,以下代码为一个send()方法中的data参数的示例:

       name=myName&value=myValue

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

6、局部更新

       在通过Ajax的异步调用获得服务器端数据之后,可以使用JavaScript或DOM来将网页中的数据进行局部更新。常用的局部更新的方式有以下3种:

       ⑴表单对象的数据更新

       表单对象的数据更新,通常只要更改表单对象的value属性值,其语法代码如下所示:

        FormObject.value = "新数值"

        有关表单对象的数据更新的示例如以下代码所示:

        <html>

                  <head>

                               <title>局部更新</title>

                               <script language = "javascript" type = "text/javascript">

                               <!--

                                          function changeData()

                                          {

                                                    document.myForm.myText.value = "更新后的数据"

                                          }

                               -->

                  </head>

                 <body>

                            <form name = "myForm">

                                      <input type = "text" value = "原数据" name = "myText">

                                      <input type = "button" value = "更新数据" onclick = "changeData()">

                            </form>

                 </body>

        </html>

        ⑵IE浏览器中标签间文本的更新

        在HTML代码中,除了表单元素之外,还有很多其他的元素,这些元素的开始标签与结束标签之间往往也会有一点文字(如以下代码所示),对这些文字的更新,也是局部更新的一部分。

       <p>文字</p>

       <span>文字</span>

       <div>文字</div>

       <label>文字</label>

       <b>文字</b>

       <i>文字</i>

       在IE浏览器中,innerText或innerHTML属性可以用来更改标签间文本的内容。其中innerText属性用于更改开始标签与结束标签之间的纯文本内容,而innerHTML属性用于更改HTML内容。如以下代码所示:

       <html>

              <head>

                        <title>局部更新</title>

                        <script language = "javascript" type = "text/javascript">

                                  <!--

                                           function changeData()

                                           {

                                                   myDiv.innerText = "更新后的数据";

                                           }

                                  -->

                        </script>

              </head>

              <body>

                       <div id = "myDive">原数据</div>

                       <input type = "button" value = "更新数据" onclick = "changeData()">

              </body>

       </html>

       ⑶DOM技术的局部刷新

       innerText和innerHTML两个属性都是IE浏览器中的属性,在Netscape浏览器中并不支持该属性。但无论是IE浏览器还是Netscape浏览器,都支持DOM。在DOM中,可以修改标签间的文本内容。

       在DOM中,将HTML文档中的每一对开始标签和结束标签都看成是一个节点。例如HTML文档中有一个标签如下所示,那么该标签在DOM中称之为一个“节点”。

       <div id = "myDiv">原数据</div>

       在DOM中使用getElementById()方法可以通过id属性值来查找该标签(或者说是节点),如以下语句所示:

       var node = document.getElementById("myDiv");

       注意:在一个HTML文档中,每个标签中的id属性值是不能重复的。因此,使用getElementById()方法获得的节点是唯一的。

       在DOM中,认为开始标签与结束标签之间的文本是该节点的子节点,而firstChild属性可以获得一个节点下的第1个子节点。如以下代码可以获得<div>节点下的第1个子节点,也就是<div>标签与</div>标签之间的文字节点。

      node.firstChild

      注意,以上代码获得的是文字节点,而不是文字内容。如果要获得节点的文字内容,则要使用节点的nodeValue属性。通过设置nodeValue属性值,可以改变文字节点的文本内容。完整的代码如下所示:

      <html>

               <head>

                         <title>局部更新</title>

                         <script language = "javascript" type = "text/javascript">

                         <!--

                                   function changeData()

                                   {

                                             //查找标签(节点)

                                             var node = document.getElementById("myDiv");

                                             //在DOM中标签中的文字被认为是标签中的子节点

                                             //节点的firstChild属性为该节点下的第1个子节点

                                             //nodeValue属性为节点的值,也就是标签中的文本值

                                             node.firstChild.nodeValue = "更新后的数据";

                                   }

                         -->

                         </script>

               </head>

      </html>

      注意:目前主流的浏览器都支持DOM技术的局部刷新。

7、完整的AJAX实例

       <html>

                <head>

                           <title>AJAX实例</title>

                           <script language="javascript" type="text/javascript">   
                           <!--

                                     var xmlHttpRequest;  //定义一个变量用于存放XMLHttpRequest对象
                                     //定义一个用于创建XMLHttpRequest对象的函数
                                     function createXMLHttpRequest()
                                    {
                                            if(window.ActiveXObject)
                                            {
                                                   //IE浏览器的创建方式
                                                   xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
                                            }else if(windew.XMLHttpRequest)
                                           {
                                                  //Netscape浏览器中的创建方式
                                                  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("异步调用出错\n返回的HTTP状态码为:"+xmlHttpRequest.status + "\n返回的HTTP状态信息为:" + xmlHttpRequest.statusText);
                                               }
                                         }
                                     }
                                    //异步调用服务器段数据
                                   function getData(name,value)
                                  {                  
                                       //创建XMLHttpRequest对象
                                       createXMLHttpRequest();
                                       if(xmlHttpRequest!=null)
                                       {
                                            //创建HTTP请求
                                            xmlHttpRequest.open("get","ajax.text",true)
                                           //设置HTTP请求状态变化的函数
                                            xmlHttpRequest.onreadystatechange = httpStateChange;
                                           //发送请求
                                          xmlHttpRequest.send(null);
                                        }
                                  }

                           -->
                          </script>

                </head>

                <body>

                         <div id="myDiv">原数据</div>

                         <input type = "button" value = "更新数据" onclick = "getData()">

                </body>

       </html>

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ShanderLam/archive/2008/10/13/3067308.aspx

分享到:
评论

相关推荐

    Ajax介绍,为什么用ajax

    Ajax介绍,基本步骤,为什么用ajax!!!!

    Ajax上传实现根据服务器端返回数据进行js处理的方法

    以前也做过上传,基本是是使用commons-fileupload组件,基本的步骤是使用servlet处理完上传之后,使用PrintWrite的对象实例输出显示内容,可以是直接输出内容,也可以是输出script进行操作如 代码如下:response....

    Ajax实现简单下拉选项效果【推荐】

    基本都是固定步骤!主要在JAVASCRIPT和PHP中的操作 1、HTML代码里就只有两个SELECT标签如下: &lt;select id="province"&gt; 请选择 &lt;/select&gt; &lt;select id="city"&gt; 请选择 &lt;/select&gt; 2、...

    ajax实现异步文件或图片上传功能

    其实文件上传有两种方法,一种是from表单submit提交,一种是ajax实现异步提交,可是form表单提交有个问题就是每次在上传完成时会刷新界面,不能实现异步上传,所以现在几乎所有网站都采用ajax异步上传,现在我给大家...

    springMVC poi解析ajax上传excel文件,返回json对象\list数组

    此项目是基于springMVC实现的,基本流程为从前台jsp页面使用Ajax文件上传导入excel文件(.xls(97-03)/.xlsx(07以后)),传到后台controller调用相应工具类解析后返回指定参数做后续处理. 1. POIUtil.java工具类 解析...

    AjaxPro.dll 7.7.31

    本文主要总结一下AjaxPro的使用步骤,并实现Ajax无刷新检测数据的简单功能。 在传统方式中,用户注册的时候,常常需要用户填写完整个表单,再提交给服务器。当系统检测该用户名已存在,便返回提示用户,并需要重新...

    网站前端设计资料

    js基础教程:Javascript[1] 是一种由Netscape的...于是Netscape的浏览器Navigator加入了Javascript,提供了数据验证的基本功能,js的作用也主要在实现网页的一些特效,css难以实现的特效,通常和Jquery,Ajax,联合使用.

    基于 jQuery 的 Web 源程序在线评测系统的设计与实现

    有关键技术和设计步骤。 本论文的创造性不仅在于讨论了在 Linux 系统上实现评判核心单元的关键技术和 具体方法,还在于使用了较大篇幅讨论了在线评测系统的层次结构,而这个结构常常 制约着现今很多在线评测系统的...

    JAVA上百实例源码以及开源项目

    2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性...

    低清版 大型门户网站是这样炼成的.pdf

    2.3.2 struts 2应用基本开发步骤—搭建eportal应用 69 2.3.3 struts 2中集成fckeditor 80 2.3.4 struts 2中集成displaytag 83 2.4 struts 2国际化实现 85 2.4.1 web应用的中文本地化 85 2.4.2 struts 2应用的...

    亮剑.NET深入体验与实战精要2

    10.2.2 客户端实现步骤 395 10.3 基于TCP协议的客户端和服务端 398 10.3.1 TcpListener 实现网络服务端 398 10.3.2 TcpClient实现网络客户端 399 本章常见技术面试题 401 常见面试技巧之经典问题巧回答 401 本章小结...

    亮剑.NET深入体验与实战精要3

    10.2.2 客户端实现步骤 395 10.3 基于TCP协议的客户端和服务端 398 10.3.1 TcpListener 实现网络服务端 398 10.3.2 TcpClient实现网络客户端 399 本章常见技术面试题 401 常见面试技巧之经典问题巧回答 401 本章小结...

    Java基础知识点总结.docx

    十九、 Ajax原理及实现步骤★★★★★ 130 Ajax概述 130 Ajax工作原理 130 Ajax实现步骤 130 详解区分请求类型: GET或POST 131 $.ajax标准写法 134 二十、 正则表达式:其实是用来操作字符串的一些规则★★★☆ 135 ...

    千方百计笔试题大全

    244、客服端调用EJB对象的几个基本步骤 56 245、 如何给weblogic指定大小的内存? 56 246、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 57 247、如何启动时不需输入用户名与密码? 57 248、在weblogic...

    java面试宝典

    244、客服端调用EJB对象的几个基本步骤 56 245、 如何给weblogic指定大小的内存? 56 246、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 57 247、如何启动时不需输入用户名与密码? 57 248、在...

    java web技术开发大全(最全最新)

    除此之外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》还提供了两个完整的实例来讲解开发SSH的详细步骤和方法。通过对这两个实例的学习,读者可以对SSH开发模式有更透彻地理解和认识。SSH是...

    基于ssm+Vue的大学生宿舍管理系统(源码+部署说明+系统介绍+数据库).zip

    前端通过Ajax与后端进行通信,实现数据的交互。部署说明:为了方便部署和管理,本项目提供了详细的部署说明。部署说明包括了如何配置服务器环境、如何安装依赖库、如何启动项目等步骤。此外,还提供了一些常见的问题...

    wizerd-forms:用于创建灵活的多步骤表单的库

    wɪzə(r)d Forms将帮助您构建自己的多步骤Forms,并完全控制所有内容。自定义控件?没问题。通过AJAX通话追加新页面?您只需几行代码就可以实现。 入门 安装 NPM npm install @steinrein/wizerd-forms 下载 ...

    java web开发技术大全

    除此之外,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》还提供了两个完整的实例来讲解开发SSH的详细步骤和方法。通过对这两个实例的学习,读者可以对SSH开发模式有更透彻地理解和认识。SSH是...

    asp.net知识库

    根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件...

Global site tag (gtag.js) - Google Analytics