zoukankan      html  css  js  c++  java
  • ajax

    以前,浏览器只是为了渲染静态页面。但是随着技术更新换代,人们开始大量使用表单与网页进行交互。但是我们都知道,如果使用表单提交数据的时候,会刷新页面(跳转页面)为了避免跳转页面,Ajax 出现了

    表单提交问题,例如:当我们只是修改表单中某一个字段的时候,点击提交按钮,依然会跳转页面

    特点:使用AJAX不仅仅可以与服务器中进行数据交互,还可以在不跳转页面的情况下实现局部页面更新

     

    全称:Asynchronous javascript And XML 异步的JS和XML

     

      XML:可拓展标记语言,以前也是进行前后端数据交互的

     

      特点:只要具备文档声明, 所有的标签都是自定义的。但是使用XML传递数据的时候,前端解析起来比较麻烦,后端生成文件也是比较麻烦,所以逐渐被json数据所代替

     

    AJAX不是一门新技术,最早出现在IE5

     

    ajax的优点:
      1、最大的一点是页面无刷新更新,用户的体验非常好。
      2、使用异步方式与服务器通信,具有更加迅速的响应能力。。
      3、可以将一些服务器工作转嫁到客户端,利用客户端资源来处理,减轻服务器和带宽的压力,节约空间和宽带租用成本。ajax 的原则是“按需获取数据”,可以最大程度的减少冗余请求及响应对服务器造成的负担。
      4、技术标准化,并被浏览器广泛的支持,不需要下载插件或者小程序。
      5、ajax 可使因特网应用程序更小、更快,更友好
    ajax的缺点:
      1、ajax 不支持浏览器 back 按钮。
      2、安全问题 AJAX 暴露了与服务器交互的细节。
      3、对搜索引擎不友好
      4、破坏了程序的异常机制。
      5、不容易调试

    在IE8以上包括高级浏览器它们都支持XMLHttpRequest这个构造函数;在IE8之前它们支持ActiveXObject这个构造函数。通过构造函数的实例化对象调用某些方法即可发送AJAX请求

    实例化对象xhr的一些属性: 

      readyState 存有的XMLHttpRequest的状态从0到4发生变化。

        

      response 表示服务器的响应内容。

      responseType 表示服务器返回数据的类型,缺省为空字符串,可取 "arraybuffer","blob", "document", "json", "text" 共五种类型。

      reponseText 以文本形式返回响应(接收到的响应文本)。

      responseXML 以XML格式返回响应

      status 将状态返回为数字(例如,“Not Found”为404,“OK”为200)

       

      statusText 以字符串形式返回状态(例如,“Not Found”或“OK”)

      timeout 用于指定ajax的超时时长,表示多少毫秒后,如果请求仍然没有得到结果,就会自动终止。

        

      upload 属性默认返回一个XMLHttpRequestUpload对象,用于上传资源

    实例化对象xhr的一些方法:

      open() 用于指定发送HTTP请求的参数(建立TCP链接)

         

      send() 表示实际发出HTTP请求。参数是携带的数据

        

      abort() 取消当前请求。 

      getAllResponseHeaders() 以字符串形式返回完整的HTTP标头集。

      getResponseHeader( name) 返回指定HTTP标头的值。

      setRequestHeader(key,value) 将标签/值对添加到要发送的HTTP标头。

      overrideMimeType() 用于强制指定response的MIME类型,即强制修改response的Content-Type。

    实例化对象xhr的一些事件:

      onreadystatechange事件 监听readystate状态改变

        

      onloadstart事件 在ajax请求发送之前触发,触发时机在readyState==1状态之后,2状态之前

      onprogress事件 在readyState==3状态时开始触发。

      

      onerror事件 在ajax请求出错后执行,通常只在网络出现问题时触发

      onabort事件 用来终止已经发出的HTTP请求。取消后, readyState状态将被设置为0。

      onload事件 onload事件回调方法在ajax请求成功后(readyState==4状态后)触发。

      onloadend事件 在ajax请求完成后(readyState==4状态后或者readyState==2状态后)触发。

      ontimeout事件 判断请求超时。

     

      如果接收的数据比较大,还可以在监听状态码前写入加载动画代码;在xhr.status===200完成后,更改代码

    封装一个ajax方法

       ajax({

              url: 请求地址
              method: 提交方式
              data: 提交的数据(如果是GET请求,该数据会添加给url)
              headers: 修改请求头配置
         }).then()   通过then方法监听结果。
      function ajax(option) {
            // 适配
            option = Object.assign({
                method: 'GET',
                url: '',
                data: null,
                // 是否异步
                async: true,
            }, option)
            // 对data做处理
            // 如果data是对象要转成query格式
            if (typeof option.data !== 'string') {
                // 将data转成字符串
                let str = '';
                // 解析对象
                for (let key in option.data) {
                    str += '&' + key + '=' + option.data[key]
                } 
                // 更新data字符串
                option.data = str.slice(1)
            }
            // 如果是get请求,不能提交data,数据应该放在url上
            if (option.method.toUpperCase() === "GET") {
                // 没有请求体,数据要放在url上
          if (option.data) {
                  option.url += '?' + option.data;
             }
            // 请求体不需要提交数据了
                option.data = null;
            }
            // 返回promise对象
            return new Promise((resolve, reject) => {
                // 创建xhr
                let xhr;
                if (window.XMLHttpRequest) {
                    // 标准浏览器
                    xhr = new XMLHttpRequest();
                } else if (window.ActiveXObject) {
                    // IE浏览器
                    xhr = new ActiveXObject();
                } else {
                    return reject('不支持ajax')
                }
                // 监听状态
                xhr.onreadystatechange = function() {
                    // 监听数据返回
                    if (xhr.readyState === 4) {
                        // 判断状态码
                        if (xhr.status === 200 || xhr.status === 304) {
                            // 数据返回了
                            resolve(JSON.parse(xhr.responseText))
                        }
                    }
                }
                // 打开连接
                xhr.open(option.method, option.url, option.async);
                // 如果传递了请求头,修改请求头
                if (option.headers) {
                    // 遍历每一项
                    for (let key in option.headers) {
                        // 修改请求头
                        xhr.setRequestHeader(key, option.headers[key])
                    }
                }
                // 发送请求
                xhr.send(option.data)
            })
        }
  • 相关阅读:
    BZOJ-3495 前缀优化建图2-SAT
    洛谷P3979 遥远的国度 树链剖分+分类讨论
    hdu
    hdu
    poj
    poj-1330(暴力写的lca)
    树链剖分
    Dijkstra
    Floyed
    最短路径
  • 原文地址:https://www.cnblogs.com/yess/p/14732547.html
Copyright © 2011-2022 走看看