XHR2通信基础

xhr2于xhr最大的区别在于xhr只支持字符串类型的数据,而xhr2支持任意类型的数据。使用XHR2向服务器请求一张图片。

 1 <script>
 2   var xhr=new XMLHttpRequest();
 3   xhr.open('get','image.jpg',true);
 4   //处理返回类容的类型
 5   xhr.responseType='blob';
 6   xhr.onload=function(e){
 7        if(this.status==200){
 8           var url=window.URL.createObjectURL(this.response);
 9           var img=new image();
10           img.src=url;
11           document.body.appendChild(img);
12        }
13   }
14   xhr.send();
15 </script>

ArrayBuffer

ArrayBuffer是一种数据类型,存放原始的固定长度的二进制数据,但ArrayBuffer无法操作它的类容,必须创建一个代表固定格式的ArrayBufferView来 读取具体的二进制数据。 实例

 var buffer=new ArrayBuffer(16);

 var int32View=new Int32Array(buffer);

同一块内存buffer可以被多个视图所超控。

FormData

XHR2的新类型,使用FormData提交表单

1:常见的提交表单
var formdata=new FormData();
formdata.append('username','frienr');
var xhr=new XMLHttpRequest();
xhr.open('post','/server',true);
xhr.send(formdata);

2:直接提交表单元素
function sendForm(form){
  var formData=new FormData(form);
  //在以知的表单后添加
  formdata.append('token','1233');
   xhr.send(formdata);
}
sendForm(document.getElementById('form1'));

xhr2新增了个upload属性,并可以为之绑定一个onprogress事件,检测上传的速度

<progress></progress>
<script>
  var xhr=new XMLHttpRequest();
  xhr.open('POST','/SERVER',true);
  xhr.onload=function(){......}
  //配合HTML5的progress一起使用
  var progressBar=document.querySelector('progress');
  xhr.upload.onprogress=function(e){ 
     if(e.lengthComputable){
       progressBar.value=(e.loaded/e.total)*100;
     }
  };
  xhr.send(blobOrFile)
}
var int16Array=new Int16Array(16)
var blob=new Blob([int16Array])
upload(blob);
</script>

xhr不能跨越,但xhr2新增了跨源资源共享的能力在服务器设置一些标头实现真正的跨域Ajax请求 可以跨某个域的http标头

Access-Control-Allow-Origin:http://example.com 

可以来自所有域的访问

Access-Control-Allow-Origin:*

让跨域的http请求带上cookie等 Access-Control-Allow-Credentials:true

在客户端发送请求时需要在发送请求前将xhr的对象withCredentials设置为true eg xhr.withCredentials=true;

posted @ 2016-01-26 15:06  舒莉  阅读(2327)  评论(0编辑  收藏  举报