URL.createObjectURL() 与 URL.revokeObjectURL()
.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
URL.createObjectURL() 与 URL.revokeObjectURL()的更多相关文章
- URL.createObjectURL和URL.revokeObjectURL
一.URL.createObjectURL URL.createObjectURL()方法会根据传入的参数创建一个指向该参数对象的URL. 这个URL的生命仅存在于它被创建的这个文档里,新的对象URL ...
- JS获取当前网页内容,创建文件并下载,URL.createObjectURL和URL.revokeObjectURL
有时候需要在前端侧对于动态生成的内容进行下载,比如页面上某一段文本信息,再比如对页面进行分享的时候,希望分享图片是页面内容的实时截图,此时,这个图片就是动态的,纯HTML显然是无法满足我们的需求的,借 ...
- 图片上传预览 (URL.createObjectURL)
知识预备:1. URL.createObjectURL() 静态方法会创建一个 DOMString,它的 URL 表示参数中的对象.这个 URL 的生命周期和创建它的窗口中的 document 绑定. ...
- URL.createObjectURL()
URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL.这个 URL 的生命周期和创建它的窗口中的 document 绑定.这个新 ...
- URL.createObjectURL()的使用方法
URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL.这个 URL 的生命周期和创建它的窗口中的 document 绑定.这个新 ...
- FileReader与URL.createObjectURL实现图片、视频上传前预览
之前做图片.视频上传预览常用的方案是先把文件上传到服务器,等服务器返回文件的地址后,再把该地址字符串赋给img或video的src属性,这才实现所谓的文件预览.实际上这只是文件“上传后再预览”,这既浪 ...
- js图片前端预览之 filereader 和 window.URL.createObjectURL
//preview img : filereader方式 document.getElementById('imgFile').onchange = var ele = document.getEle ...
- html5的FormData对象和input的file属性以及window.URL.createObjectURL( ) 方法(转载)
/** FormData ==>表单数据 能自动把表单数据拼接打包 当ajax发送数据时,发送打包的数据; 还可以使用FormData对象的append(key,value)添加数据 FormD ...
- URL.createObjectURL() 实现本地上传图片 并预览功能
URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL.这个 URL 的生命周期和创建它的窗口中的 document 绑定.这个新 ...
随机推荐
- OpenCV探索之路(二十二):制作一个类“全能扫描王”的简易扫描软件
相信很多人手机里都装了个"扫描全能王"APP,平时可以用它来可以扫描一些证件.文本,确实很好用,第一次用的时候确实感觉功能很强大啊算法很牛逼啊.但是仔细一想,其实这些实现起来也是很 ...
- Unity 发布的 WebGL 使用SendMessage传递多个参数
如果要实现Unity与浏览器的数据交互一般都会采用两种方式 方法一: Application.ExternalCall("SayHello","helloworld&qu ...
- React Native 系列(九) -- Tab标签组件
前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. ...
- UVa 10934 Dropping water balloons:dp(递推)
题目链接:https://vjudge.net/problem/27377/origin 题意: 有一栋n层高的楼,并给你k个水球.在一定高度及以上将水球扔下,水球会摔破:在这个高度以下扔,水球不会摔 ...
- oracle-使用数据泵对不同用户和不同表空间的数据迁移
oracle-使用数据泵对不同用户和不同表空间的数据迁移 ---------------------------------------------------2013/11/13 expdp和imp ...
- Redis sentinel 哨兵模式集群方案配置
第一个方案是创建 redis cluster,第二种方案就是用哨兵模式来进行主从替换以及故障恢复.兵模式集群方案配置 一.sentinel介绍 Sentinel作用: 1):Master状态检测 2) ...
- ajax轮询实时获取数据
最近做一个评论功能时,想要实现实时异步刷新评论功能,于是使用了ajax轮询,这里简单记录一下ajax轮询的原理及使用方法. ajax轮询的原理就是客户端定时向服务端发送ajax请求,服务器接到请求后马 ...
- SVProgressHUD源码解读(2.0.3)
SVProgressHUD是iOS开发中比较常用的一个三方库,用来在执行耗时操作或者指示用户操作结果的场合,由于使用简单,功能丰富,交互友好,被广泛应用.本文从源码的角度,解读一下实现的过程,希望能起 ...
- CentOS 7 服务器配置--安装Java和Tomcat
一 安装 JAVA (jdk_8u121_linux_x64) #查看是否安装了OpenJDK #检查是否安装了JAVA java -version rpm -qa | grep java #卸载已安 ...
- 在学习泛型时遇到的困惑经常与func<T,U>混淆
在学习泛型时遇到的困惑经常与func<T,U>混淆,总认为最后一个值是返回类型.现在区分一下,原来问题出在泛型委托上. C#委托的介绍(delegate.Action.Func.predi ...