记录一下目前项目常用到的一些工具方法

上传与下载

首先要了解数据转换

图片来源 (https://shanyue.tech/post/binary-in-frontend/#%E6%95%B0%E6%8D%AE%E8%BE%93%E5%85%A5)

下载

  • 关于 application/octet-stream 和 Content-Disposition
    浏览器并不认得这是什么类型,也不知道应该如何展示,只知道这是一种二进制文件,因此遇到content-type为application/octet-stream的文件时,浏览器会直接把它下载下来。这个类型一般会配合另一个响应头Content-Disposition,该响应头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者网页的一部分),还是以附件的形式下载并保存到本地。
/**
 * 使用a标签下载一个文件
 * @param {} url  下载文件的接口路径(可以提交要下载文件的名称来修改下载文件的路径) 或者 下载文件的路径(不能修改下载文件的名称)
 *  例如:http://xx/xxx/xxx/download?filename='123' 或者 http://xx/xxx/xxx/download/123.pdf
 */
export const createIFrameDownLoad = (url) => {
  const iframeDom = document.createElement('iframe')
  iframeDom.style.zIndex = -100
  iframeDom.style.position = 'fixed'
  document.body.insertBefore(iframeDom, document.body.children[0])
  const iframeWin = iframeDom.contentWindow // 1.获取iframe中的window
  const iframeDocs = iframeWin.document // 2.获取iframe中的document
  iframeDocs.write(`<!doctype html>`)
  iframeDocs.write(`
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    </head>
    <body>
    <a href="${url}"  target="_self" id="downLoad" ></a>
    </body>
    </html>
  `)
  const a = iframeDocs.querySelector('#downLoad')
  a.click()
  setTimeout(() => {
    document.body.removeChild(iframeDom)
  }, 10000)
}
/**
 *  
 * @param {} src 文件路径 'https://dakaname.oss-cn-hangzhou.aliyuncs.com/file/2018-12-28/1546003282521.pdf'
 * @param {} name
 */
export const downFile = function(src, name = '') {
  // 下载非同源图片
  const x = new XMLHttpRequest()
  // 禁止浏览器缓存;否则会报跨域的错误
  x.open('GET', src, true) // 打开对象,也可以说是设置参数
  x.responseType = 'blob'
  x.onload = function(e) {
    // 异步请求加载完成后所执行的函数
    const url = window.URL.createObjectURL(x.response)
    const a = document.createElement('a')
    a.href = url
    a.download = name
    a.click()
  }
  x.send()
}
/**
 * 注意 axios 需要添加 :responseType = 'blob'
 * @param {*} content 文件流内容
 * @param {*} name 文件的名称
 */
export const downLoadFileByStream = (content, name, type = '.xls') => {
  var elink = document.createElement('a')
  // name为后台返给前端的文件名,后缀名必须加,后台有返回后缀就不用管,不然下载在本地不好打开。
  elink.download = name + type
  elink.style.display = 'none'
  var blob = new Blob([content])
  elink.href = URL.createObjectURL(blob)
  document.body.appendChild(elink)
  elink.click()
  setTimeout(() => {
    document.body.removeChild(elink)
  }, 10000)
}
export const  downloadfile = (res) => {
   var blob = new Blob([res.data], { type: 'application/octet-stream;charset=UTF-8' })
   var contentDisposition = res.headers['content-disposition']
   var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
   var result = patt.exec(contentDisposition)
   var filename = result[1]
   var downloadElement = document.createElement('a')
   var href = window.URL.createObjectURL(blob) // 创建下载的链接
   var reg = /^["](.*)["]$/g
   downloadElement.style.display = 'none'
   downloadElement.href = href
   downloadElement.download = decodeURI(filename.replace(reg, '$1')) // 下载后文件名
   document.body.appendChild(downloadElement)
   downloadElement.click() // 点击下载
   document.body.removeChild(downloadElement) // 下载完成移除元素
   window.URL.revokeObjectURL(href)
}

上传

上传经常要配和对话框进行文件上传进度展示
目前接触到的上传基本为multipart/form-data(二进制文件上传)
基本用的是FormData的API,而上传需要处理的更多的是文件的类型筛选和进度展示,中断,重传,拖拽等

节流与防抖

防抖:对于短时间内连续触发的事件(如滚动事件,按钮提交),防抖的含义就是让某个时间期限(如500毫秒)内,事件处理函数只执行一次(最后一次)
ex:滚动事件用防抖打印console.log只会出现一次

/**
* 防抖函数 -> 会把前一个清除
* @param method 事件触发的操作
* @param delay 多少毫秒内连续触发事件,不会执行(默认500毫秒)
* @returns {Function} handleInput:debounce(function(val){}){ console.log(val)  }
*/
const debounce = (method, delay) => {
  delay = delay || 500
  let timer = null
  return function() {
    const self = this
    const args = arguments
    timer && clearTimeout(timer)
    timer = setTimeout(function() {
      method.apply(self, args)
    }, delay)
  }
}

节流:如果短时间内大量触发同一事件,那么在函数执行一次之后,该函数在指定的时间期限内不再工作,直至过了这段时间才重新生效(类似开关)。
ex:滚动事件用节流打印console.log,每500ms会出现一次

function throttle(fn,delay=500){
    let valid = true
    return function() {
      const self = this
      const args = arguments
       if(!valid){
           //休息时间 暂不接客
           return false 
       }
       // 工作时间,执行函数并且在间隔期内把状态位设为无效
        valid = false
        setTimeout(() => {
            fn.apply(self,args)
            valid = true;
        }, delay)
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容

  • vue生命周期 生命周期:实例初始化之前:beforeCreate实例初始化:created挂载前:beforeM...
    汉卿阅读 226评论 0 0
  • axios和ajax的区别 axios是通过promise实现对ajax技术的一种封装axios可以运行nodej...
    yimi珊阅读 291评论 0 0
  • FFmpeg 在ubuntu 中编译出so - x-bing - 博客园[https://www.cnblogs....
    沉默的阿迪阅读 426评论 0 0
  • 技术点: 不定期更新补充 页面引用svg symbol标签创建icon p:nth-child(2) 与 p:nt...
    wwmin_阅读 1,482评论 0 52
  • 建议收藏文章,结合复习导图使用,效果更佳。 1. JavaScript 基础 1.1 执行上下文/作用域链/闭包 ...
    王哈哈zzz阅读 279评论 0 0