Page 244 - Web性能权威指南
P. 244

xhr.responseType = 'blob'; ➊
                     xhr.onload = function() {
                       if (this.status == 200) {
                         var img = document.createElement('img');
                         img.src = window.URL.createObjectURL(this.response); ➋
                         img.onload = function() {
                             window.URL.revokeObjectURL(this.src); ➌
                         }
                         document.body.appendChild(img);
                       }
                     };

                     xhr.send();

                 ➊ 将返回数据类型设置为 Blob
                 ➋ 基于返回的对象创建唯一的对象 URI 并设置为图片的源
                 ➌ 图片加载完毕后立即释放对象

                 注意,这里我们在以原生格式传输一张图片,没有使用 base64 编码,也没有使用数
                 据 URI,而是在页面中添加了一个 <img> 元素。这样在 JavaScript 中处理接收到的
                 二进制数据不会产生任何网络传输开销和编码开销! XHR  API 让我们得以通过
                 脚本高效、动态地开发应用,无论操作什么数据类型都没问题,全部用 JavaScript
                 搞定!


                            这里的二进制大对象接口(Blob)属于 HTML5 的 File  API,就像一个不
                            透明的引用,可以指向任何数据块(二进制或文本)。这个对象本身没有太
                            多功能,只能查询其大小、MIME 类型,或将它切分成更小的块。这个对
                            象存在的真正目的,是作为各种 JavaScript API 之间的一种高效的互操作
                            机制。


                 15.4 通过XHR上传数据


                 通过 XHR 上传任何类型的数据都很简单,而且高效。事实上,上传不同类型数据
                 的代码都一样,只不过最后在调用 XHR 请求对象的 send() 方法时,要传入相应的
                 数据对象。剩下的事就都由浏览器处理了:

                     var xhr = new XMLHttpRequest();
                     xhr.open('POST','/upload');
                     xhr.onload = function() { ... };
                     xhr.send("text string"); ➊
                     var formData = new FormData(); ➋


                                                                       XMLHttpRequest    |   231
   239   240   241   242   243   244   245   246   247   248   249