zoukankan      html  css  js  c++  java
  • Ajax学习笔记

    Ajax学习笔记

    目录

      简述

        一、创建 XMLHttpRequest 对象

        二、建立并发送 http 请求

          2.1 建立 http 请求:open(method, url, async)

          2.2 发送 http 请求:send(content)

        三、接收服务器响应

          3.1 响应阶段

          3.2 响应状态

          3.3 最终 Ajax 请求代码

        四、小结:Ajax封装

    简述

      Ajax(Asynchronous JavaScript and XML),是一种在不重新加载整个页面的情况下,用服务器上的数据更新部分页面的技术。

      Ajax 有一个核心对象:XMLHttpRequest,使用它就可以向服务器发送请求、获得数据、修改页面,一个 Ajax 应用程序其实就是在创建 Ajax 对象并调用其属性和方法。

      使用该对象有以下几个基本步骤:

    1. 创建 XMLHttpRequest 对象

    2. 建立并发送 http 请求

    3. 接收服务器响应

     

    应用场景举例:

    1. 百度搜索框提示

    2. 注册时无刷新验证用户名是否可用

    要亲自尝试 Ajax,请下载 XAMPP

     

    一、创建 XMLHttpRequest 对象

      实际上,所有现代浏览器都支持 XMLHttpRequest 对象,但是 IE5、IE6 使用的是 ActiveX 对象,所以我们可以建立一个兼容所有浏览器的函数:

    function createXHR(){
        if(window.XMLHttpRequest){
            return new XMLHttpRequest(); //主流浏览器
        }
        else{
            return new ActiveXObject("Microsoft.XMLHTTP"); //IE5、IE6
        }
    }

      接下来我们将创建并发送 http 请求,然后服务器返回的数据将自动填充 XMLHttpRequest 对象的属性,下面是几个重要属性:

    1. status:响应的 HTTP 状态
    2. readyState:请求或响应过程的当前活动阶段——0,1,2,3,4
    3. responseText:返回的文本
    4. responseXML:返回的 XML 文档

     

    二、建立并发送 http 请求

     

    2.1 建立 http 请求:open(method, url, async)

      open() 函数的三个参数分别是:

    • method:请求的类型——GETPOST

      • GET 比 POST 快而且简单

      • POST 用于更新服务器上的数据

      • POST 不限制发送的数据量

      • 发送密码时,POST 更安全

    • url:服务器上的文件地址,可以是任何类型的文件

    • asynctrue(异步)、false(同步)

      • 若发送异步请求,在等待服务器响应的过程中可以继续执行其他脚本,响应就绪后对响应进行处理

     

    2.2 发送 http 请求:send(content)

      send() 函数只有一个参数,当使用 GET 方法时,该参数必须为 null;当使用 POST 方法时,该参数是要向服务器发送的数据——字符串。

     

    三、接收服务器响应

    3.1 响应阶段

      当我们发出了一个 http 请求时,就开始等待响应了,那么我们怎么知道服务器响应什么时候来呢?那就要看前面提到的 XMLHttpRequest 对象的属性: readyState

      该属性表示请求或响应过程的当前活动阶段,总共分为 5 个阶段:

    • 0:尚未调用 open() 方法

    • 1:已调用 open() 方法,尚未调用 send() 方法

    • 2:已调用 send() 方法,尚未收到响应

    • 3:正在接收响应

    • 4:响应接收完毕,可以在客户端使用

      在请求和响应的过程中,这个属性的值会从 0 变化到 4,每一次发生变化时都会触发 XMLHttpRequest 对象的 onreadystatechange 事件,所以我们可以在该事件发生时监测 readyState 属性的值,从而确定是不是进行到了最后的阶段——因为我们只对它感兴趣。

      但是必须在调用 open() 方法之前进行状态监测,这样才能确保跨浏览器的兼容性:

    //创建对象
    var xhr = createXHR();
    //状态监测
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){    //这里务必不要使用 this
            //do some thing
        }
    };
    //建立http请求
    xhr.open("get", "example.txt", true);
    //发送http请求
    xhr.send(null);

     

    3.2 响应状态

      但是要注意,并非所有的请求都会成功,所以 XMLHttpRequest 对象还有一个属性 status 用来表示响应的 HTTP 状态,它的值是 HTTP 状态码,常用的几个如下:

    • 200——服务器响应正常。

    • 304——该资源在上次请求之后没有任何修改(这通常用于浏览器的缓存机制,使用GET请求时尤其需要注意)。

    • 400——无法找到请求的资源。

    • 401——访问资源的权限不够。

    • 403——没有权限访问资源。

    • 404——需要访问的资源不存在。

    • 405——需要访问的资源被禁止。

    • 407——访问的资源需要代理身份验证。

    • 414——请求的URL太长。

    • 500——服务器内部错误。

     

    3.3 最终 Ajax 请求代码

      如果我们要使用响应的数据来修改页面,则还需要检测状态码,所以最终使用 Ajax 的基本步骤是这样:

    //创建对象
    var xhr = createXHR();
    //状态监测
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){    //务必不要使用 this
            if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
                //do something
                alert(xhr.responseText); //比如用弹出框显示返回的文本
            }
            else{
                //do something
                alert("Request was Unsuccessful: " + xhr.status);
            }
        }
    };
    //建立http请求
    xhr.open("get", "example.txt", true);
    //发送http请求
    xhr.send(null);

     

    四、小结:Ajax封装

    现在,我们知道使用 Ajax 时需要确定以下几个因素:

    • 请求的方式

    • 请求的 URL

    • 同步还是异步

    • 请求成功时要做的事情

    • 请求失败时要做的事情

      那么,为什么不把这些封装成一个函数呢:

    /**
     * 执行Ajax请求的通用函数,每一个参数都是必须的,除了最后一个参数
     * @param {string} method :"GET" 或 "POST"
     * @param {string} url :服务器上的文件地址,可以是任何类型的文件
     * @param {boolean} async : true(同步),false(异步)
     * @param {string} content:如果是POST请求,可以传递一个字符串;如果是GET请求,必须传递 null
     * @param {function} whenSucceed : 要用函数内部创建的 XHR 对象做的事情
     * @param {function} whenFailed : 一些提示信息,可能会用到 XHR 对象
     */
     function ajaxApp(method, url, async, content, whenSucceed, whenFailed){
        /**
         * 创建 XMLHttpRequest 对象的通用函数
         * @return {object} XMLHttpRequest对象
         */
        function createXHR(){
            if(window.XMLHttpRequest){
                return new XMLHttpRequest(); //主流浏览器
            }
            else{
                return new ActiveXObject("Microsoft.XMLHTTP"); //IE5、IE6
            }
        }    
        
        //创建对象
        var xhr = createXHR();
        //状态监测
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4){    //务必不要使用 this
                if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
                    //do something
                    whenSucceed(xhr);
                }
                else{
                    //do something
                    if(whenFailed){ //该参数可选,如果有就调用一下
                        whenFailed(xhr);
                    }
                }
            }
        };
        //建立http请求
        xhr.open(method, url, async);
        //发送http请求
        xhr.send(content);
    }

     

  • 相关阅读:
    ssh无密码登录设置
    Spark Standalone Mode 多机启动 -- 分布式计算系统spark学习(二)(更新一键启动slavers)
    Spark Standalone Mode 单机启动Spark -- 分布式计算系统spark学习(一)
    为golang程序使用pprof远程查看httpserver运行堆栈,cpu耗时等信息
    golang官方实现如何对httpserver做频率限制(最大连接数限制)
    【转】涨姿势了,数据库隔离性的几个级别
    loadRunner 11.0 安装及破解
    EF 如何code first
    百度搜索自动提示搜索相关内容----模拟实现
    如何写出专业级OOP程序-----文档注释
  • 原文地址:https://www.cnblogs.com/MPK-dev/p/9541741.html
Copyright © 2011-2022 走看看