• XMLHttpRequest 学习笔记(一)


    1、XMLHttpResquest 简介

    XMLHttpRequest是一个API,用于客户端和服务器之间传输数据,通 过URL获取数据简单,且不会刷新整个页面,用户发起请求后可做其他事情,不用一直等到服务器响应,具有很好的用户体验而被广泛应用。

    2、属性和方法

           onreadystatechange

          是function类型,绑定一个函数,当请求状态(readyState)改变时,就会调用它。注意,只能在异步请求中使用。

    readyState,一个无符号整数,表示请求状态。

    0——UNSENT(未打开),创建了xhr对象,open()还没调用。

    1——opened(未发送),调用了open()但是还没调用send()。
    2——HEADERS_RECEIVED(已接收响应头信息),send()被调用,响应头和响应状态已返回。
    3——LOADING(下载响应中),响应体下载中,已经从responseText中获得部分数据。
    4——DONE(请求完成),整个请求完成,不是代表请求成功了,请求失败也算完成。

     

    response:

    只读属性,返回接收到的数据主体,类型可是ArrayBuffer(内存缓冲区?不太理解)、Bold(不太理解)、Documnet(HTML文本或片段、XML)、JSON(JS对象)、text(字符串),由responseType决定。请求失败或者数据不完整,该属性只为null。

     " "——字符串,默认值。

    "document"——Document对象即XML、html文档或html片段。
    "json"——JSON对象。
    "text"——字符串。
    "blod"——Bold对象(不是很明白??)

    var xhr= new XMLHttpResquest();
    xhr.open("GET",URL,true);
    xhr.responseType="json";


    responseType 设置为 json,支持json的浏览器,主流浏览器都支持,会自动调用JSON.parese()方法,将JSON解析为JS对象,就是说 从xhr.response(不是xhr.responseText属性)属性得到的不是文本,是JS对象。

     

     


    responseText,

    返回的字符串,只读,请求不成功或者数据不完整,该属性为null。如果返回的是JSON格式的数据,就可以调用responseText属性。

    1 var data = xhr.responseText;
    2 data=JSON.parse(data);//解析JSON为JS对象。


    status,

    只读属性,HTTP状态码,是一个三位数的整数。

    200,ok,响应成功。

    301,Moved Permanently,永久移动。
    302, Move temporarily,暂时移动
    304, Not Modified,未修改
    307, Temporary Redirect,暂时重定向
    401, Unauthorized,未授权
    403, Forbidden,禁止访问
    404, Not Found,未发现请求资源
    500, Internal Server Error,服务器发生错误


    只有 2xx和304表示服务器正常。

    1 if (ajax.readyState == 4) {
    2   if ( (ajax.status >= 200 && ajax.status < 300)
    3     || (ajax.status == 304) ) {
    4     // Handle the response.
    5   } else {
    6     // Status error!
    7   }
    8 }

    statusText,只读属性,一个字符串,表示服务器的状态,是一个完整信息,如 “200 OK”。

     1   var xhr = new XMLHttpRequest();
     2   xhr.ontimeout = function () { //timeout 是 xhr 的一个事件,超时时触发
     3     console.error("The request for " + url + " timed out.");
     4   };
     5   xhr.onload = function() { //load 是 xhr 的一个事件,表示加载
     6     if (xhr.readyState === 4) {
     7       if (xhr.status === 200) {
     8         callback.apply(xhr, args);
     9       } else {
    10         console.error(xhr.statusText);
    11       }
    12     }
    13   };
    14   xhr.open("GET", url, true);//初始化一个请求
    15   xhr.timeout = timeout; //设置超时
    16   xhr.send(null); //发送请求
    17 }

    方法:

    abort()——请求发送后,调用该方法中断,在send()之后调用,否则报错。

    getAllReponseHeaders()——获取全部响应头信息,响应还没接收,返回null。

    getResponseHeader(DOMString header)——返回指定的头信息,不接受或者不存在,返回null。

    open(method,url,[async,uers,password])——初始一个请求,该方法用在js中,本地openRequest()。    

    参数:
         method:HTTP方法:GET|POST|PUT|DELETE。不是HTTP(S)的协议,忽略该参数。保持大写,否则有些浏览                   器不识别。
                url:请求服务器的页面。出于安全考虑,必须是相同域名下的页面。
            async:布尔值,表示是否采用异步请求,可选。true为默认值,表示异步。
             uesr:用户名,可选。
      password:密码,可选。

    overrideMimeType(),

    重写服务器返回的MIME type。如强制将响应流当成"text/html"来处理和解析。必须在sned()之前调用。
    这个比较麻烦,一般用 responseType属性设置。

    1 var xhr = new XMLHttpRequest();
    2 xhr.onload = function(e) {
    3   var arraybuffer = xhr.response;
    4   // ...
    5 }
    6 xhr.open("GET", url);
    7 xhr.responseType = "arraybuffer";
    8 xhr.send();

    send(): 发送请求,异步请求,立即返回,同步请求,直到响应完全接收后返回。所有相关的事件绑定必须在调用send()方法之前进行.

    在POST方法中,向服务器提交的表单数据传入send()中,序列化和转码处理,名值对用&连接,如 "name=jack&age=20",且在send()调用前,需要设置MIME类型:
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    GET请求中不用参数。send()或者send(null)

    setRequestHeader(),设置HTTP请求头的信息,必须在open()之后和send()之前。

    事件:

    loadstart:请求开始,loadstart事件被触发。

      属性:

      arget:事件目标。

      type:事件类型。

      loaded:大于零的数,表示已经加载的资源的字节数。

      total:加载资源的总数。

    用于 xhr请求 <img>、<video>。

    progress:请求进度。
        error:请求出错时触发。
       abort:请求中断而不是因为错误,常常是用户取消。
         load:资源下载完成。
    loadend:下载结束,当不再加载资源是触发,如何出现 error、abort,load。
    timeout:加载超时。

    上传文件时,XMLHTTPRequest对象的upload属性有一个progress,会不断返回上传的进度。

       

    1 <progress min="0" max="100" value="0">0% complete</progress>
     1 function upload(blobOrFile) {//定义上传文件函数
     2   var xhr = new XMLHttpRequest();
     3   xhr.open('POST', '/server', true);
     4   xhr.onload = function(e) { ... };
     5 
     6   // Listen to the upload progress.
     7   var progressBar = document.querySelector('progress');
     8   xhr.upload.onprogress = function(e) {
     9     if (e.lengthComputable) { //lengthComputable 是 progress 的一个属性,表示资源是否可计算字节流
    10       progressBar.value = (e.loaded / e.total) * 100;
    11       progressBar.textContent = progressBar.value; //有点浏览器不支持,这是后备选择
    12     }
    13   };
    14 
    15   xhr.send(blobOrFile);
    16 }
    17 
    18 upload(new Blob(['hello world'], {type: 'text/plain'}));
     1 xhr.addEventListener("progress", updateProgress);
     2 xhr.addEventListener("load", transferComplete);
     3 xhr.addEventListener("error", transferFailed);
     4 xhr.addEventListener("abort", transferCanceled);
     5 
     6 xhr.open();
     7 
     8 function updateProgress (oEvent) {
     9   if (oEvent.lengthComputable) { //可计算数据总量
    10     var percentComplete = oEvent.loaded / oEvent.total;
    11     // ...
    12   } else {
    13     // 回应的总数据量未知,导致无法计算百分比
    14   }
    15 }
    16 
    17 function transferComplete(evt) {
    18   console.log("The transfer is complete.");
    19 }
    20 
    21 function transferFailed(evt) {
    22   console.log("An error occurred while transferring the file.");
    23 }
    24 
    25 function transferCanceled(evt) {
    26   console.log("The transfer has been canceled by the user.");
    27 }

    今天就学到这里了,在第二篇中写一个发起请求函数。还是不太熟悉博客园的后台,用的很不习惯。

  • 相关阅读:
    【数据结构】10.java源码关于LinkedHashMap
    【数据结构】9.java源码关于HashTable
    【数据结构】8.java源码关于HashMap
    【数据结构】7.java源码关于LinkedList
    【LEETCODE】69、动态规划,easy,medium级别,题目:198、139、221
    【LEETCODE】68、动态规划,medium级别,题目:95、120、91
    【LEETCODE】67、分治递归,medium&hard级别,题目:215、312
    【数据结构】6.java源码ArrayList
    【LEETCODE】66、字符串分类,hard级别,题目:32,72,76
    mysql查询所有表数据大小
  • 原文地址:https://www.cnblogs.com/jackzhoumine/p/6562890.html
Copyright © 2020-2023  润新知