AJAX数据传输的四大步骤

AJAX数据传输的四大步骤

  • 1、XHR 创建对象 2、XHR 请求 3、XHR 响应 4、XHR readyState

AJAX - 创建 XMLHttpRequest(XHR) 对象

所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。

XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

  • 创建 XMLHttpRequest 对象的语法:

      variable=new XMLHttpRequest();
    
  • 老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:

      variable=new ActiveXObject("Microsoft.XMLHTTP");
    
  • 为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject :

AJAX - 服务器请求(连接与发送)

send()请求是同步的,意味着后续的js代码必须等到服务器响应之后才继续执行。所以在收到响应后,
响应的数据会自动填充到XHR对象的属性。

  1. 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:

     var url="ajax_info.txt";
     xmlhttp.open("GET",url,true);
     xmlhttp.send();
    
    方法描述
    open(method,url,async)规定请求的类型、URL 以及是否异步处理请求。
    method:请求的类型;GET 或 POST
    url:文件在服务器上的位置
    async:true(异步)或 false(同步)
    send(string)将请求发送到服务器。 string:仅用于 POST 请求,null或不填用于get请求
  2. 信息传输方式是 GET 还是 POST?

    与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。

    然而,在以下情况中,请使用 POST 请求:

    • 无法使用缓存文件(更新服务器上的文件或数据库)
    • 向服务器发送大量数据(POST 没有数据量限制)
    • 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

    举例说明

    • 如果您希望通过 GET 方法发送信息,请向 URL 添加信息(使用老师课件的添加方式-循环):

         xmlhttp.open("GET","/try/ajax/demo_get2.php?fname=Henry&lname=Ford",true);
         xmlhttp.send();
      

      但是url加的查询字符串必须使用 encodeURICompent()或者encodeURI()进行编码才能加入。

        ```
           function addURLParam(url,name,value) {
               url+=(url.indexOf("?")==-1)?"?":"&";
               url+=encodeURIComponent(name)+"="+encodeURIComponent(value);
               return url;
           }
        ```
      
    • 一个简单 POST 请求:

        xmlhttp.open("POST","/try/ajax/demo_post.php",true);
        xmlhttp.send();
      
  3. url - 服务器上的文件

    • open() 方法的 url 参数是服务器上文件的地址

        xmlhttp.open("GET","ajax_test.html",true);
      

    该文件可以是任何类型的文件,比如 .txt 和 .xml,或者服务器脚本文件,比如 .asp 和 .php (在传回响应之前,能够在服务器上执行任务)。

  4. 异步 - True 或 False?

    • AJAX 指的是异步 JavaScript 和 XML(Asynchronous JavaScript and XML)。

      XMLHttpRequest 对象如果要用于 AJAX 的话,其 open() 方法的 async 参数必须设置为 true:

        xmlhttp.open("GET","ajax_test.html",true);
      

      对于 web 开发人员来说,发送异步请求是一个巨大的进步。很多在服务器执行的任务都相当费时。AJAX 出现之前,这可能会引起应用程序挂起或停止。

    • 通过 AJAX,JavaScript 无需等待服务器的响应,而是:

      • 在等待服务器响应时执行其他脚本
      • 当响应就绪后对响应进行处理 (这里用到的是回调机制)
    • 在这里,就可以体现出回调的意义所在——解决异步:

      • 将处理权(即函数)交给别人,别人执行完毕后,调用该函数
  5. 当使用异步时:Async=true

  • 当使用 async=true 时,请规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数:

      xmlhttp.onreadystatechange=function()
      {
          if (xmlhttp.readyState==4 && xmlhttp.status==200)
          {
              document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
          }
      }
      xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
      xmlhttp.send();
    
  1. 发送请求 send()

    • send() 方法。

      oAjax.send(null);
      //如果不需要传送数据,则必须放置null。因为部分浏览器要求必须要加null。
      
      
         oAjax.send($('#myform').serialize());
      
    • 如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:

         xmlhttp.open("POST","/try/ajax/demo_post2.php",true);
         xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
         xmlhttp.send("fname=Henry&lname=Ford");
      
      方法描述
      setRequestHeader(header,value)向请求添加 HTTP 头。
      header: 规定头的名称;
      value: 规定头的值

AJAX - 服务器 响应

  • 如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。

    属性描述
    responseText获得字符串形式的响应数据。
    responseXML获得 XML 形式的响应数据。
  1. responseText 属性

    如果来自服务器的响应并非 XML,请使用 responseText 属性。

    responseText 属性返回字符串形式的响应,因此您可以这样使用:

     document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    
  2. responseXML 属性

    如果来自服务器的响应是 XML,而且需要作为 XML 对象进行解析,请使用 responseXML 属性:

    请求 cd_catalog.xml 文件,并解析响应:

        xmlDoc=xmlhttp.responseXML;
        txt="";
        x=xmlDoc.getElementsByTagName("ARTIST");
        for (i=0;i<x.length;i++)
        {
            txt=txt + x[i].childNodes[0].nodeValue + "<br>";
        }
        document.getElementById("myDiv").innerHTML=txt;
    

AJAX - onreadystatechange 事件

  1. onreadystatechange 事件

    当请求被发送到服务器时,我们需要执行一些基于响应的任务。

    • 每当 readyState 改变时,就会触发 onreadystatechange 事件。

    • readyState 属性存有 XMLHttpRequest 的状态信息。

    下面是 XMLHttpRequest 对象的三个重要的属性:

    属性描述
    onreadystatechange存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
    readyState存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
    0: 请求未初始化
    1: 服务器连接已建立
    2: 请求已接收
    3: 请求处理中
    4: 请求已完成,且响应已就绪
    status200: “OK”
    404: 未找到页面
    • 在 onreadystatechange 事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务(0-3)。

      当 readyState 等于 4 且状态为 200 时,表示响应已就绪:

        xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
            }
        }
      

      注意: onreadystatechange 事件被触发 4 次(0 - 4), 分别是: 0-1、1-2、2-3、3-4,对应着 readyState 的每个变化。

实例:

    <script>
    function loadXMLDoc()
    {
        var xmlhttp;
        if (window.XMLHttpRequest)
        {
            //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
            xmlhttp=new XMLHttpRequest();
        }
        else
        {
            // IE6, IE5 浏览器执行代码
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
            }
        }
        xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
        xmlhttp.send();
    }
    </script>
    </head>
    <body>

    <div id="myDiv"><h2>使用 AJAX 修改该文本内容</h2></div>
    <button type="button" onclick="loadXMLDoc()">修改内容</button>

    </body>

实例 使用回调函数

  • 回调函数是一种以参数形式传递给另一个函数的函数。

  • 如果您的网站上存在多个 AJAX 任务,那么您应该为创建 XMLHttpRequest 对象编写一个标准的函数,并为每个 AJAX 任务调用该函数。

    该函数调用应该包含 URL 以及发生 onreadystatechange 事件时执行的任务(每次调用可能不尽相同):

<!DOCTYPE html>
<html>
<head>
<script>
var xmlhttp;
function loadXMLDoc(url,cfunc)
{
if (window.XMLHttpRequest)
  {// IE7+, Firefox, Chrome, Opera, Safari 代码
  xmlhttp=new XMLHttpRequest();
  }
else
  {// IE6, IE5 代码
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=cfunc;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
function myFunction()
{
	loadXMLDoc("/try/ajax/ajax_info.txt",function()
	{
		if (xmlhttp.readyState==4 && xmlhttp.status==200)
		{
			document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
		}
	});
}
</script>
</head>
<body>

<div id="myDiv"><h2>使用 AJAX 修改文本内容</h2></div>
<button type="button" onclick="myFunction()">修改内容</button>

</body>
</html>

小结

  • 请记住,JavaScript 会等到服务器响应就绪才继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止。

    这样看似是同步的,这里是说业务流程是同步的,它是按顺序执行的,比如下面代码

    xmlhttp.onreadystatechange=function(){...}
    xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
    xmlhttp.send();
    

    它们本身是同步的,但是方法一耗时了,会先执行下面的两个方法,后面的两个方法不会等待

    所以方法一即使在前面,也会最后响应;再例如:

        f=function(){
            读文件
        }
    
        console.log(f)  //f是undefine
    

    这就说明,js是异步脚本语言

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值