zoukankan      html  css  js  c++  java
  • Ajax详解

    Ajax详解

    Ajax(Asynchronous JavaScript And XML)

    传统web交互使用户触发一个http请求,服务器接收到请求之后,响应到用户,返回一个新页面;AJAX是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。

    异步与同步

    JS是单线程语言, 同步 代码会从上到下执行,如果中间某一段代码执行时间较长,后面的代码必须等待前面执行完,才能执行。JS 对于这种场景就设计了异步,JS代码执行的机制是将遇到的异步代码放到 异步队列 中,执行完所有同步代码后,异步代码再出队列执行。

    优点和不足

    • 优点
      1. 不需要插件支持(一般浏览器且默认开启 JavaScript 即可)
      2. 用户体验极佳(不刷新页面即可获取可更新的数据)
      3. 提升 Web 程序的性能(在传递数据方面做到按需放松,不必整体提交)
      4. 减轻服务器和带宽的负担(将服务器的一些操作转移到客户端)
    • 不足
      1. 不同版本的浏览器度 XMLHttpRequest 对象支持度不足(比如 IE5 之前)
      2. 前进、后退的功能被破坏(因为 Ajax 永远在当前页,不会记录前后页面)
      3. 3.搜索引擎的支持度不够(因为搜索引擎爬虫还不能理解 JS 引起变化数据的内容)

    Ajax交互

    1. 准备页面请求,创建XMLHttpRequest对象

      let xhr = new XMLHttpRequest();
      
    2. 使用XMLHttpRequest对象的open()和send()方法发送请求

      /**open()有三个参数
      *@param {string} method 提交方法 
      *@param {string} url 提交地址
      *@param {boolean} true 是否异步,默认为异步,一般不设置
      */
      //get提交
      xhr.open('get','url?id=1');
      //send()方法参数里放request body里面的携带的值
      xhr.send()//get方法提交不传参
      
      //post提交
      xhr.open('post','url');
      //设置enctype
      xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
      //发送请求信息
      xhr.send('id=1');
      
    3. onreadystatechange函数,状态改变时发送数据回客户端,使用 XMLHttpRequest对象的responseText或responseXML属性获得服务器的响应

      xhr.onreadystatechange = function(){
          //判断状态是否为完成响应
          if(xhr.readyState == 4){
             //判断返回值是否正确
              if (xhr.status == 200) {
                  console.log(xhr.responseText);
              }
              
           }
      }
      
      • 1** 请求收到,继续处理

      • 2** 操作成功收到,分析、接受

      • 3** 完成此请求必须进一步处理

      • 4** 请求包含一个错误语法或不能完成

      • 5** 服务器执行一个完全有效请求失败

        100——客户必须继续发出请求

        101——客户要求服务器根据请求转换HTTP协议版

        200——交易成功

        201——提示知道新文件的URL

        202——接受和处理、但处理未完成

        203——返回信息不确定或不完整

        204——请求收到,但返回信息为空

        205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件

        206——服务器已经完成了部分用户的GET请求

        300——请求的资源可在多处得到

        301——删除请求数据
        302——在其他地址发现了请求数据

        303——建议客户访问其他URL或访问方式

        304——客户端已经执行了GET,但文件未变化

        305——请求的资源必须从服务器指定的地址得到

        306——前一版本HTTP中使用的代码,现行版本中不再使用

        307——申明请求的资源临时性删除

        400——错误请求,如语法错误

        401——请求授权失败

        402——保留有效ChargeTo头响应

        403——请求不允许

        404——没有发现文件、查询或URl

        405——用户在Request-Line字段定义的方法不允许

        406——根据用户发送的Accept拖,请求资源不可访问

        407——类似401,用户必须首先在代理服务器上得到授权

        408——客户端没有在用户指定的饿时间内完成请求

        409——对当前资源状态,请求不能完成

        410——服务器上不再有此资源且无进一步的参考地址

        411——服务器拒绝用户定义的Content-Length属性请求

        412——一个或多个请求头字段在当前请求中错误

        413——请求的资源大于服务器允许的大小

        414——请求的资源URL长于服务器允许的长度

        415——请求资源不支持请求项目格式

        416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段

        417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求

        500——服务器产生内部错误

        501——服务器不支持请求的函数

        502——服务器暂时不可用,有时是为了防止发生系统过载

        503——服务器过载或暂停维修

        504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长

        505——服务器不支持或拒绝支请求头中指定的HTTP版本

    浏览器同源策略

    浏览器安全策略,保障非同源资源之间数据访问的安全性,默认不允许非同源的资源直接访问。

    URL:协议://域名:端口/路径名称?查询字符串#位置标识符

    同源:协议、域名、端口完全一致,只要三个中有任何一个不一致,则是非同源。非同源资源间需要进行访问,则需要实现跨域。

    跨域

    1. CORS(cross-origin resource sharing,跨域资源共享)

      只需在服务器端设置响应头信息:Access-Control-Allow-Origin:*,如

      header("Access-Control-Allow-Origin:*");  //php
      
    2. jsonp

      利用<script>在引入外部JS时不受同源策略限制的特性,来实现跨域。(src的开放性原则)

      JSONP只能处理GET请求方式的跨域

      function jsonp(url, fn, query) {
              let str = '';
              //拼接回调函数参数
              url += `?cb=${fn}`;
              if (query) {
                  //拼接其他函数
                  for (let key in query) {
                      str += `&${key}=${query[key]}`;
                  }
              }
              //参数拼接在url后面
              url += str;
              //创建一个script
              const script = document.createElement("script");
              //设置src
              script.src = url;
              //将script渲染到页面
              document.body.appendChild(script);
              //请求后移除script
              document.body.removeChild(script);
          }
      
    3. proxy(代理) 通过当前服务器访问跨域的服务器
      初始化 npm init

      全局安装gulp npm i gulp -g

      本地下载gulp包 npm i gulp --save-dev

      本地下载http-proxy-middleware包 npm i http-proxy-middleware -dev

    const proxy = require('http-proxy-middleware') //指定任务
    // 原请求方式:$.get('http://localhost:80/api/login.php')
    const server = () => {
    connect.server({
    port: 8081, //自定义端口
    root: 'dist', //端口根目录
    livereload: true,
    // 中间件:指的是在请求响应过程当中做一些处理
    // 是一个函数,返回值是一个数组,在数组里配置代理跨域
    middleware () {
    return [
    // 将前端请求以/api开头的代理到后端端口
    proxy('/api', {
    target: 'http://localhost:80', //请求的后端端口
    changeOrigin: true
    })
    ]
    }
    })
    }

    ```
    

    promise(ES6)

    承诺:兑现(resolve)或 失信(rejected)

    这个对象有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和 Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是「承诺」,表示其他手段无法改变。

    new Promise((resolve, reject) => {
        var xhr = new XMLHttpRequest()
        xhr.open('get', './06.php?id=5')
        xhr.send()
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
            	if (xhr.status === 200) {
            	// resolve只能传一个参数,如果要传递多个参数,使用对象
            		resolve(xhr.responseText, 5)
            	} else {
                	reject()
            	}
            }
        }
    }).then((resp, num) => {
        console.log(resp)
        console.log(num) // undefined
    }).catch(() => {
        console.log('网络错误')
    })
    
    • Promise.all(iterable)

      -- iterable : 可迭代对象(数组)

      -- 返回Promise对象

      -- 当数组中所有Promise对象都完成时,回调执行成功的函数,当只要有一个执行失败时,就回调执行失败的函数。

    • Promise.race(iterable)

      -- iterable : 可迭代对象(数组)

      -- 返回Promise对象

      -- 当数组中所有Promise对象任意有一份完成时,回调执行成功的函数。

    by:逆战班 陈亮

  • 相关阅读:
    局域网组网总目录
    VLAN之间的通信
    DHCP
    ACL
    linux 程序后台运行
    VLAN
    VTP
    dubbox生产者与消费者案例
    String data jpa执行的增删改查
    StringBoot整合Mytais实现数据查询与分页
  • 原文地址:https://www.cnblogs.com/chenliang0817/p/12349679.html
Copyright © 2011-2022 走看看