file,js图片预览

这篇博客介绍了如何利用URL.createObjectURL和URL.revokeObjectURL在JavaScript中实现图片预览。文章详细阐述了这两个方法的工作原理,强调了URL对象的生命周期管理和内存优化。并提供了一个通过AJAX获取图片二进制数据并显示在页面上的示例,同时提及了对低版本浏览器的兼容方案,尤其是IE的滤镜技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.


兼容IE

兼容IE可以使用IE的滤镜

关于滤镜可参考 http://www.jb51.net/css/71829.html

这里使用到

filter : progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled=bEnabled , sizingMethod=sSize , src=sURL )
属性:
enabled  :  可选项。布尔值(Boolean)。设置或检索滤镜是否激活。
true  :  默认值。滤镜激活。 false  :  滤镜被禁止。 
sizingMethod  :  可选项。字符串(String)。设置或检索滤镜作用的对象的图片在对象容器边界内的显示方式。
crop  :  剪切图片以适应对象尺寸。 
image  :  默认值。增大或减小对象的尺寸边界以适应图片的尺寸。 
scale  :  缩放图片以适应对象的尺寸边界。 
src  :  必选项。字符串(String)。使用绝对或相对 url 地址指定背景图像。假如忽略此参数,滤镜将不会作用。

document.selection 
参考文章  http://blog.youkuaiyun.com/cui_angel/article/details/7837749
document.selection 表示当前网页中的选中内容。 
方法有:
    clear 清除选中的内容 
    empty 取消选中 
    createRange 返回 TextRange 或 ControlRange 对象 
    createRangeCollection 不支持
属性有:
    type 选中内容的类型 
    typeDetail 不支持 二、document.selection.createRange()详细介绍
     document.selection.createRange() 根据当前文字选择返回 TextRange 对象,或根据控件选择返回ControlRange 对象。
配合 execCommand,在 HTML 编辑器中很有用,比如:文字加粗、斜体、复制、粘贴、创建超链接等。
var i = document.getElementById("file");
var div = document.getElementById("pre");

//非IE
i.onchange = function(){
//使用window.URL.createObjectURL(i.files[0])
}
//IE
i.onpropertychange = function(){

div.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
div.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = i.value;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值