美文网首页
js手动触发图片下载

js手动触发图片下载

作者: 小小了墨 | 来源:发表于2019-08-13 11:51 被阅读0次

概述

前景

在项目开发中,发现通过增加a标签的download属性来下载文件,如果是图片会直接跳转不会下载,所以通过js去实现下载

兼容

由于项目本身使用的是vue,所以不支持ie9以下的,而ie9以上的都支持对应的api

但是考虑到不是vue的,所以还是用原生的写法,改成vue也好改嘛

具体实现

场景1(先预览,再下载)

  • html

如果图片的地址和当前不同源,则需要加上crossorigin="anonymous"属性;

如果同源,则可以不加上(ps: 减少代码)

<div id="imgBox">
    <img id="image" src="xxx" crossorigin="anonymous">
</div>
  • js

直接读取img标签生成的图片,可以避免二次下载,但是需要图片加载完成才能去点击下载,不然会下载不完整

const img = document.querySelector('#image');
// 下载功能
function downlaod () {
    let canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    const img = document.querySelector('#image');
    canvas.width = img.naturalWidth;
    canvas.height = img.naturalHeight;
    ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);
    canvas.toDataURL('image/jpeg', 1);
    let dataUrl = canvas.toDataURL();
    let aObj = document.createElement('a');
    aObj.download = demo.jpeg;
    aObj.href = dataUrl;
    aObj.click();
    // 清除缓存,释放空间
    dataUrl = null;
    aObj = null;
    canvas = null;
}
// 这里是确保图片加载完成
img.onload = () => {
    const imgBox = document.querySelector('#imgBox');
    const button = document.createElement('button');
    button.onclick = (e) => {
        if (e && e.preventDefault) {
            e.preventDefault();
        }
        download();
    }
    button.innerHtml = '下载';
    imgBox.appendChild(button);
};

场景2(直接下载)

  • html
<button id="download">下载</button>
  • js

这样的好处是随时点随时下载,不需要等图片加载完再去点

const btn = document.querySelector('#download');
btn.onclick = (e) => {
    if (e && e.preventDefault) {
        e.preventDefault();
    }
    let img = new Image();
    img.src = 'xxxx';
    img.crossorigin = 'anonymous';
    img.onload = () => {
        let canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');
        canvas.width = img.naturalWidth;
        canvas.height = img.naturalHeight;
        ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);
        canvas.toDataURL('image/jpeg', 1);
        let dataUrl = canvas.toDataURL();
        let aObj = document.createElement('a');
        aObj.download = options.name;
        aObj.href = dataUrl;
        aObj.click();
        dataUrl = null;
        aObj = null;
        canvas = null;
        img = null;
    }
}

注意: 上面两种方式,最好都加个防抖动处理

相关文章

  • js手动触发图片下载

    概述 前景 在项目开发中,发现通过增加a标签的download属性来下载文件,如果是图片会直接跳转不会下载,所以通...

  • js手动触发窗口resize事件

    手动触发resize事件: 需要调用时: 增加resize监听事件(局部demo):

  • 如何手动触发一个value的KVO

    所谓的“手动触发”是区别于“自动触发”: 想知道如何手动触发,必须知道自动触发KVO的原理: 转载自《猿圈》 那么...

  • 手动触发KVO

    [self willChangeValueForKey:@"属性名称"]; // “手动触发的KVO”[self ...

  • 手动触发KVO

    KVO中,当被观察的属性改变时,KVO被触发。举例如下:KVO监测Person类实例person的name属性。当...

  • 手动触发事件

    可通过原生方法调用的事件: 无法用原生方法分发的事件,可以通过 target.dispatchEvent 方法分发...

  • 手动 触发 kvo

    手动 触发 kvo 过程如下: 重写automaticallyNotifiesObserversForKey 返回...

  • KVO—手动触发

    如上所示的Student类有个score属性,通过KVO添加观察者监听score属性后,可以通过下面3中方式来改变...

  • 谁说你只是"会用"jQuery?

    前言 套用上篇文章向zepto.js学习如何手动触发DOM事件 的开头??? 前端在最近几年实在火爆异常,vue、...

  • redux和sessionStorage,localStorag

    1.redux中的数据,在刷新(手动或者js触发)页面时,就会消失(或者说被初始化),无法持久化。2.sessio...

网友评论

      本文标题:js手动触发图片下载

      本文链接:https://www.haomeiwen.com/subject/paevjctx.html