.URL.createObjectURL

URL.createObjectURL()方法会根据传入的参数创建一个指向该参数对象的URL. 这个URL的生命仅存在于它被创建的这个文档里. 新的对象URL指向执行的File对象或者是Blob对象.

语法:

objectURL = URL.createObjectURL(blob || file);

参数:

File对象或者Blob对象

这里大概说下File对象和Blob对象:

File对象,就是一个文件,比如我用input type="file"标签来上传文件,那么里面的每个文件都是一个File对象.

Blob对象,就是二进制数据,比如通过new Blob()创建的对象就是Blob对象.又比如,在XMLHttpRequest里,如果指定responseType为blob,那么得到的返回值也是一个blob对象.

注意点:

每次调用createObjectURL的时候,一个新的URL对象就被创建了.即使你已经为同一个文件创建过一个URL. 如果你不再需要这个对象,要释放它,需要使用URL.revokeObjectURL()方法. 当页面被关闭,浏览器会自动释放它,但是为了最佳性能和内存使用,当确保不再用得到它的时候,就应该释放它.

二.URL.revokeObjectURL

URL.revokeObjectURL()方法会释放一个通过URL.createObjectURL()创建的对象URL. 当你要已经用过了这个对象URL,然后要让浏览器知道这个URL已经不再需要指向对应的文件的时候,就需要调用这个方法.

具体的意思就是说,一个对象URL,使用这个url是可以访问到指定的文件的,但是我可能只需要访问一次,一旦已经访问到了,这个对象URL就不再需要了,就被释放掉,被释放掉以后,这个对象URL就不再指向指定的文件了.

比如一张图片,我创建了一个对象URL,然后通过这个对象URL,我页面里加载了这张图.既然已经被加载,并且不需要再次加载这张图,那我就把这个对象URL释放,然后这个URL就不再指向这张图了.

语法:

window.URL.revokeObjectURL(objectURL);

参数:

objectURL 是一个通过URL.createObjectURL()方法创建的对象URL.

 

这两个方法不支持低版本浏览器.

最后,给个综合栗子:

通过ajax获取一张图片,显示在页面里.

html:

<body>
<button id="getPic">获取图片的Blob数据</button>
</body>

js:

//获取图片Blob数据
document.getElementById(‘getPic‘).onclick = function(e){
$.ajax({
type:‘GET‘,
url:‘img.png‘,
resDataType:‘blob‘,
imgType:‘png‘,
success:function(resText,resXML){
var img = document.createElement(‘img‘);
var objectUrl = window.URL.createObjectURL(resText);
img.src = objectUrl;
img.onload = function(){
window.URL.revokeObjectURL(objectUrl);
};
document.body.appendChild(img);
},
fail:function(err){
console.log(err)
}
});
e.preventDefault();
}

指定返回的数据格式为blob二进制数据.

通过返回的图片二进制数据来创建一个对象URL.

当图片加载完成后释放对象URL.

ajax.js:

var $={};
$.ajax = function(options){
//1.获取参数
var type = options.type.toUpperCase() || ‘GET‘;
var resDataType = options.resDataType || ‘string‘;
var reqDataType = options.reqDataType || ‘string‘;
var url = options.url;
var data = options.data;
var success = options.success;
var fail = options.fail;
var progress = options.progress;
var imgType = options.imgType || ‘jpg‘; //2.获取xhr对象
var xhr = $.getXhr(); //3.建立连接
xhr.open(type,url);
/*指定返回数据的格式需要在发送请求之前*/
if(resDataType===‘blob‘){
xhr.responseType = ‘blob‘;
} //4.发送请求
if(type===‘GET‘){
xhr.send(null)
}
else if(type===‘POST‘) {
if(progress){
xhr.upload.onprogress = progress;
}
if(reqDataType===‘json‘){
xhr.setRequestHeader(‘Content-Type‘,‘application/json;charset=UTF-8‘);
data = JSON.stringify(data); //只能发送字符串格式的json,不能直接发送json
}
if(reqDataType===‘string‘){
xhr.setRequestHeader(‘Content-Type‘,‘application/x-www-form-urlencoded‘);
}
xhr.send(data);
} //5.接收数据
xhr.onreadystatechange = function(){
if(this.readyState===4 && (this.status>=200 && this.status<300)){
var res;
if(resDataType===‘json‘){
res = JSON.parse(this.responseText);
success.call(this,res,this.responseXML)
}
if(resDataType===‘blob‘){
res = new Blob([this.response],{type:‘image/‘+imgType});
success.call(this,res)
} }
};
};

指定响应的格式是二进制数据.

使用xhr.response来获取响应的二进制数据,而不是xhr.responseText. 当定义了xhr.responseType=‘blob‘以后,xhr就没有responseText属性了.

这里虽然使用new Blob(),但其实不用它,直接返回xhr.response,一样是正确的.

参考原文: https://developer.mozilla.org/en-US/docs/Web/API/URL.revokeObjectURL

最新文章

  1. HTML5 —— 自学第一课
  2. JavaScript 五种(构造方式)继承
  3. 【web JSP basePath】basePath的含义
  4. 试用版SQL Server 2008 R2 提示评估期已过
  5. Intellij IDEA调试功能
  6. listView中的button控件获取item的索引
  7. OS X Yosemite下安装Hadoop2.5.1伪分布式环境
  8. myEclipse笔记(1):优化配置
  9. linux管理员切换与管理员密码第一次设置
  10. CSS3+HTML5特效6 - 闪烁的文字
  11. 连接linux主机
  12. C# App.config配置文件的讲解
  13. 设计模式(6)--Adapter(适配器模式)--结构型
  14. 关于mybatis 注解sql sum(参数)传参写法
  15. 8080端口被System占用
  16. HDU 2077 汉诺塔IV (递推)
  17. C#编程(十二)----------函数
  18. ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)
  19. centos7添加服务
  20. JS 获取指定日期的前几天,后几天

热门文章

  1. Github 开源:使用升讯威 Mapper( Sheng.Mapper)与 AutoMapper 互补,大幅提高开发效率!
  2. ABP+AdminLTE+Bootstrap Table权限管理系统第十一节--bootstrap table之用户管理列表
  3. 点击文字选中radio
  4. 【NO.10】Jmeter - 一个完整的录制脚本的过程
  5. Fiddler过滤会话
  6. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(四)用户接口层之处理SDP报文
  7. 【秒懂】号称最为简明实用的Django上手教程(下)
  8. C#高级编程:泛型优点和特性
  9. 获取windows所有用户名
  10. 7.21.03 while循环和do...while循环