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 }

 

 

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

 

posted @ 2017-03-17 03:33  JackChouMine  阅读(9524)  评论(0编辑  收藏  举报