zoukankan      html  css  js  c++  java
  • Ajax(1) —— Ajax基础

    1.   Ajax介绍

    Ajax即Asynchronous JavaScript and XML,是异步的JavaScript与XML。Ajax提供了基于服务器交换数据并实现局部更新网页的技术,在不重新加载整个网页的情况下,可以接受来自服务器请求到的数据,提高了浏览页面的效率和用户体验。

    2.   Ajax基础

    2.1.创建Ajax对象

    XMLHttpRequest是Ajax的对象,所有现代浏览器(IE7+、Firefox、Chrome、Safari、Opera)均支持XMLHttpRequest对象,而低版本的IE(IE5和IE6)使用ActiveXObject对象。XMLHttpRequest用于在后台与服务器交换数据。即可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

    为了兼容所有浏览器的情况,包括低版本的IE,创建Ajax对象可以使用如下代码:

    function getAjax() {
        var xhr = null;
            if(XMLHttpRequest){
                xhr = new XMLHttpRequest();
            }else if(ActiveXObject){
                xhr = new ActiveXObject("Microsoft XMLHTTP");
            }
            return xhr;
    }

    2.2.XHR请求

    XMLHttpRequest对象用于和服务器交换数据,将请求发送到服务器,主要使用open()和send()方法

    open:创建一个新的http请求,并指定此请求的方法、URL以及验证信息

    语法:

    XMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);

    示例代码:

    var xhr = getAjax();
        /**
         *  oXMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);
         *  bstrMethod http方法,例如:POST、GET、PUT及PROPFIND。大小写不敏感。
         *  bstrUrl 请求的URL地址,可以为绝对地址也可以为相对地址。
         *  varAsync[可选]布尔型,指定此请求是否为异步方式,默认为true。
         *  如果为真,当状态改变时会调用onreadystatechange属性指定的回调函数。
         */
        xhr.open("GET", "/getTime");
        xhr.send();

    send:发送请求到http服务器并接收回应:

    语法:

    XMLHttpRequest.send(varBody);

    varBody:仅用于POST请求。

    对比一下简单的GET方法发送信息与POST方法发送信息:

    //GET方式
    xmlhttp.open("GET","demo_get2.asp?fname=Bill&lname=Gates",true);
    xmlhttp.send();
    
    //POST方式
    xmlhttp.open("POST","demo_post.asp",true);
    xmlhttp.send();

    如果需要像 HTML 表单form中那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:

    var username = document.getElementById("username").value;
    var password = document.getElementById("password").value;
    xhr.open("POST", "/login");
    //Ajax设置请求编码 -- 使用POST请求传递参数必须加上
    //位置在send之前,open之后
    xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    //使用POST发送数据,在send里面,写入单独传参的数据
    xhr.send("username=" + username + "&password=" + password);

    GET和POST使用场景:

    GET相对于POST传递数据更简单快捷,在不涉及信息安全的场景下可以使用;

    然而,在如下情况下,请使用POST请求传递数据:

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

    2.3.XHR异步监听

    XMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword),在这个方法中,当Async为true时,表示执行Ajax后端请求时是使用异步请求的方式,这里需要在响应处使用onreadystatechange事件进行监听Ajax的状态:

    其中Async参数为可选布尔型,指定此请求是否为异步方式,默认为true。如果为true,当状态改变时会调用onreadystatechange属性指定的回调函数。

    //Ajax的异步问题可以通过Ajax的状态来解决:Ajax执行的每一步都有它对应的一个状态 readyState
        //0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)
        //1 (初始化) 对象已建立,尚未调用send方法
        //2 (发送数据) send方法已调用,但是当前的状态及http头未知
        //3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,
        //4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据
        //注意:一般我们只需要一个点:readyState==4时,状态已经拿到了
    //Ajax对象中有一个监听器,它可以监听每一次状态的变化(onreadystatechange)
    <script>
        function getTime02() {
            var xhr = getAjax(); //readyState == 0
            /**
             *  oXMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);
             *  bstrMethod http方法,例如:POST、GET、PUT及PROPFIND。大小写不敏感。
             *  bstrUrl 请求的URL地址,可以为绝对地址也可以为相对地址。
             *  varAsync[可选]布尔型,指定此请求是否为异步方式,默认为true。
             *  如果为真,当状态改变时会调用onreadystatechange属性指定的回调函数。
             */
            xhr.open("GET", "/getTime");    //readyState == 1
            //监听代码一定放在send前面
            //监听状态一般有两种情况:readyState状态和status状态
            //readyState状态:Ajax请求状态;
            //status状态:http请求响应的状态码
            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4 && xhr.status == 200){
                    console.debug(xhr.responseText);
                }
            };
            xhr.send(); //readyState == 2  3  4;发送整个流程
            /**
             *  responseText 将前台的响应信息作为字符串返回,注意:一定是作为字符串返回的
             */
        }
        </script>
        <button onclick="getTime02()">获取时间</button>

    2.4.XHR响应

    如果需要获取来自服务器的响应,需要调用XMLHttpRequest对象的responseText或者responseXML属性。

    属性

    描述

    responseText

    获得字符串形式的响应数据

    responseXML

    获得XML形式的响应数据

    responseText属性:

    将响应信息作为字符串返回,因此你可以这样使用:

    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

    responseXML属性:

    如果来自服务器的响应是XML,而且需要作为XML对象进行解析,请使用responseXML属性,比如请求books.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;

    2.5.XHR callback函数

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

    在执行多个Ajax调用任务时,可以在XMLHttpRequest对象中创建一个标准的执行流程函数,每次Ajax请求都调用这个函数执行open、send一套流程。

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

    <script type="text/javascript">
            var xhr = null;
            function loadXMLDoc(url, cfunc) {
                if(XMLHttpRequest){
                    xhr = new XMLHttpRequest();
                }else if(ActiveXObject){
                    xhr = new ActiveXObject("Microsoft XMLHTTP");
                }
                xhr.open("GET", url, true);
                xhr.onreadystatechange = cfunc;
                xhr.send();
            }
            
            function myFunction() {
                loadXMLDoc("/ajax/test1.txt", function () {
                    if(xhr.readyState == 4 && xhr.status == 200){
                        document.getElementById("myDiv").innerText = xhr.responseText;
                    }
                })
            }
        </script>
    </head>
    <body>
    <div id="myDiv"><h2>Let AJAX change this text</h2></div>
    <button type="button" onclick="myFunction()">通过 AJAX 改变内容</button>
    </body>

    博文参考文档W3School Ajax部分内容:https://www.w3school.com.cn/ajax/index.asp

  • 相关阅读:
    jquery easy ui 学习 (8)basic treegrid
    jquery easy ui 学习 (7) TreeGrid Actions
    jquery easy ui 学习 (6) basic validatebox
    jquery easy ui 学习 (5) windowlayout
    jquery easy ui 学习 (4) window 打开之后 限制操纵后面元素属性
    提示“应用程序无法启动,因为应用程序的并行配置不正确”不能加载 System.Data.SQLite.dll
    visual studio 添加虚线的快捷键
    VS2010打开项目时,出现“已经在解决方案中打开了具有该名称的项目”问题的解决方案
    visual studio 编译时 出现 Files 的值 乱码
    微信 连接被意外关闭
  • 原文地址:https://www.cnblogs.com/yif0118/p/13124483.html
Copyright © 2011-2022 走看看