js常用方法
1.后端返回文件流下载excel操作?
// 接口地址 export const ecoResProjectExportExcel = data => request({ url: '/ecoResProject/exportExcel', method: 'post', data, responseType: 'arraybuffer' }) /* 数据导出 */ clickexport () { let deletearr = [...this.tableSelection] this.loadingDc = true dataEconomicsExportExcel({ aeIds: deletearr.map(val => val.aeId) }).then(res => { if (res.status === 200) { const tempBlob = new Blob([ res.data ], { type: 'application/json' }) // 通过 FileReader 读取这个 blob const reader = new FileReader() reader.onload = e => { const res1 = e.target.result // 此处对fileReader读出的结果进行JSON解析 // 可能会出现错误,需要进行捕获 try { const json = JSON.parse(res1) for (const key in json) { if (json[key] === 1009) { this.$router.push({ path: '/login' }) } } } catch (err) { this.loadingDc = false const link = document.createElement('a') let blob = new Blob([res.data], { type: 'application/vnd.ms-excel' }) link.style.display = 'none' link.href = URL.createObjectURL(blob) // link.href = config.eprUrl +'/'+ res.data.data // link.download = res.headers['content-disposition'].split('')[1].split(';')[1] // 下载后文件名 link.download = '社会经济' + res.headers['content-disposition'].split(';')[1].split('=')[1] document.body.appendChild(link) link.click() document.body.removeChild(link) this.tableSelection = [] } } // 将blob对象以文本的方式读出,读出完成后将会执行 onload 方法 reader.readAsText(tempBlob) } else { this.$Notice.info({ title: '导出失败' }) } }).catch((error) => console.log(error) ) },
2.经纬度和度分秒互相转换?
/* 转换经纬度为度分秒 */ export const cacuLonLat = a => { if (a === undefined || a === null) { return undefined } else { let degree = parseInt(a) let min = parseInt((a - degree) * 60) let sec = ((a - degree) * 3600 - min * 60).toFixed(2) let min00 = '00' + min min = min00.substring(min00.length - 2, min00.length) return degree + '°' + min + '′' + sec + '″' } } // 度分秒转经纬度 48°33´13.70" export const DegreeConvertBack = val => { let du = val.split('°')[0] let fen = val.split('°')[1].split('´')[0] let miao = val.split('°')[1].split('´')[1].split('"')[0] return parseFloat(Math.abs(du)) + parseFloat((Math.abs(fen) / 60) + parseFloat(Math.abs(miao) / 3600)) }
3.数字每3位加,?
/* 将数字每三位加 , */ export const toThousands = (num) => { let result = '' let counter = 0 num = (num || 0).toString() for (let i = num.length - 1; i >= 0; i--) { counter++ result = num.charAt(i) + result if (!(counter % 3) && i !== 0) { result = ',' + result } } return result }
4.日期转换格式?
/* 日期格式装换 */ export const renderTime = date => { if (date === null || date === undefined|| date === '') { return '' } let d = new Date(date) let month = d.getMonth() + 1 if (month < 10) { month = '0' + month } let date1 = d.getDate() if (date1 < 10) { date1 = '0' + date1 } let times = d.getFullYear() + '-' + month + '-' + date1 return times } /* 年份格式装换 */ export const renderYearTime = date => { if (date === null || date === undefined) { return '' } let d = new Date(date) let times = d.getFullYear() return times } /* 日期格式装换-- 精确到秒 */ export const renderDateTime = date => { if (date === null || date === undefined) { return '' } let d = new Date(date) let times = d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds() return times }
5.v-resize监控div长宽的变化?
// vue中的自定义指令 // v-resize监控div长宽的变化 Vue.directive('resize', { bind (el, binding) { let width = '' let height = '' function get () { const style = document.defaultView.getComputedStyle(el) if (width !== style.width || height !== style.height) { binding.value({ width, height }) } width = style.width height = style.height } el.__vueReize__ = setInterval(get, 200) }, unbind (el) { clearInterval(el.__vueReize__) } })
6.判断一个数组对象里面的值是否为空?
judgeObjectComplete (ObjectValue) { let flag = new Boolean() flag = true for (let key in ObjectValue) { if (ObjectValue[key]) { return } else { flag = false } } if (!flag) { return false } else { return true } }, judgeListComplete (list) { let isNotComplete = list.findIndex(item => { return this.judgeObjectComplete(item) === false }) console.log(isNotComplete) if (isNotComplete > -1) { return false } else { return true } }, // 调用 this.judgeListComplete() 返回布尔值(true或 false)
7.常用的格式校验?
//校验手机号码 export function isSpecialPhone(num) { return /^1[2,3,4,5,7,8]\d{9}$/.test(num) } //校验中英文姓名 export function isName(name) { return /[a-zA-Z\u4E00-\u9FA5]+$/.test(name) } // 邮箱的校验 /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/ // 校验身份证号码 /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/; // 经度的校验 经度: -180.0~+180.0(整数部分为0~180,必须输入1到5位小数) /^[\-\+]?(0?\d{1,2}\.\d{1,5}|1[0-7]?\d{1}\.\d{1,5}|180\.0{1,5})$/ // 纬度的校验 纬度: -90.0~+90.0(整数部分为0~90,必须输入1到5位小数) /^[\-\+]?([0-8]?\d{1}\.\d{1,5}|90\.0{1,5})$/ // 纯文字校验 let reg = /^([\u4e00-\u9fa5])*$/;
8.倒计时(默认是当前时间)?
* 倒计时(默认开始时间为当前时间) * @param endTime 结束时间 * @returns 时间对象 */ const getEndTime = (startTime, endTime) => { const startDate = startTime || new Date(); //开始时间,当前时间 const endDate = new Date(endTime); //结束时间,需传入时间参数 const t = endDate.getTime() - startDate.getTime(); //时间差的毫秒数 let d = 0, h = 0, m = 0, s = 0; if (t >= 0) { d = Math.floor(t / 1000 / 3600 / 24) > 10 ? Math.floor(t / 1000 / 3600 / 24) : '0' + Math.floor(t / 1000 / 3600 / 24); h = Math.floor(t / 1000 / 60 / 60 % 24) > 10 ? Math.floor(t / 1000 / 60 / 60 % 24) > 10 : '0' + Math.floor(t / 1000 / 60 / 60 % 24) > 10; m = Math.floor(t / 1000 / 60 % 60) > 10 ? Math.floor(t / 1000 / 60 % 60) : '0' + Math.floor(t / 1000 / 60 % 60); s = Math.floor(t / 1000 % 60) > 10 ? Math.floor(t / 1000 % 60) : '0' + Math.floor(t / 1000 % 60); } return { day: d, hour: h, minute: m, second: s } }
9.压缩图片?
dealImage (path, obj, callback) { var img = new Image() img.src = path img.onload = function () { var that = this // 默认按比例压缩 var w = that.width var h = that.height var scale = w / h w = obj.width || w h = obj.height || w / scale var quality = 0.5 // 默认图片质量为0.7 // 生成canvas var canvas = document.createElement('canvas') var ctx = canvas.getContext('2d') // 创建属性节点 var anw = document.createAttribute('width') anw.nodeValue = w var anh = document.createAttribute('height') anh.nodeValue = h canvas.setAttributeNode(anw) canvas.setAttributeNode(anh) ctx.drawImage(that, 0, 0, w, h) // 图像质量 if (obj.quality && obj.quality <= 1 && obj.quality > 0) { quality = obj.quality } // quality值越小,所绘制出的图像越模糊 var base64 = canvas.toDataURL('image/jpeg', quality) // 回调函数返回base64的值 callback(base64) } }
10.图片转成base64?
getImgData (img, dir, next) { var image = new Image() image.onload = function () { var degree = 0 var drawWidth var drawHeight var width var height drawWidth = this.naturalWidth drawHeight = this.naturalHeight // 以下改变一下图片大小 var canvas = document.createElement('canvas') canvas.width = width = drawWidth canvas.height = height = drawHeight var context = canvas.getContext('2d') // 判断图片方向,重置canvas大小,确定旋转角度,iphone默认的是home键在右方的横屏拍摄方式 switch (dir) { // iphone横屏拍摄,此时home键在左侧 case 3: degree = 180 drawWidth = -width drawHeight = -height break // iphone竖屏拍摄,此时home键在下方(正常拿手机的方向) case 6: canvas.width = height canvas.height = width degree = 90 drawWidth = width drawHeight = -height break // iphone竖屏拍摄,此时home键在上方 case 8: canvas.width = height canvas.height = width degree = 270 drawWidth = -width drawHeight = height break } // 使用canvas旋转校正 context.rotate((degree * Math.PI) / 180) context.drawImage(this, 0, 0, drawWidth, drawHeight) // 返回校正图片 next(canvas.toDataURL('image/jpeg', 0.8)) } image.src = img }
11.纯前端的表格转excel
<script> npm install file-saver --save // 安装 import FileSaver from "file-saver" npm install xlsx // 安装 import XLSX from "xlsx" exportExcel() { /*获取表格数据 */ var wb = XLSX.utils.book_new() var centers = XLSX.utils.table_to_sheet(document.querySelector("#center_table")) var products = XLSX.utils.table_to_sheet(document.querySelector("#product_table")) var center_month = XLSX.utils.table_to_sheet(document.querySelector("#center_table_month")) var departs = XLSX.utils.table_to_sheet(document.querySelector("#depart_table")) /* 添加多个工作薄,如果只有一个,则只写一个 */ XLSX.utils.book_append_sheet(wb, center_month, "各中心月度费用统计") XLSX.utils.book_append_sheet(wb, centers, "各中心申请费用类型统计") XLSX.utils.book_append_sheet(wb, products, "各业务产品申请费用统计") XLSX.utils.book_append_sheet(wb, departs, "各部门申请费用统计") /* 使用iview表格时删除最后一行 */ for (let key in centers) { if (key.includes('A')) { if (one[key].v === '暂无筛选结果') { delete one[key] } } } var wbout = XLSX.write(wb, { bookType: "xlsx", bookSST: true, type: "array" }) try { FileSaver.saveAs( // Blob 对象表示一个不可变、原始数据的类文件对象。 // Blob 表示的不一定是JavaScript原生格式的数据。 // File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。 // 返回一个新创建的 Blob 对象,其内容由参数中给定的数组串联组成。 new Blob([wbout], { type: "application/octet-stream" }), // 设置导出文件名称 xxx.xlsx "中心申请费用类型统计.xlsx" ) } catch (e) { if (typeof console !== "undefined") console.log(e, wbout) } return wbout }, </script
20.解析Blob内容并下载?
/** * 解析blob响应内容并下载 * @param {*} res blob响应内容 * @param {String} mimeType MIME类型 */ export function resolveBlob(res, mimeType) { const aLink = document.createElement('a') var blob = new Blob([res.data], { type: mimeType }) // //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名; var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*') var contentDisposition = decodeURI(res.headers['content-disposition']) var result = patt.exec(contentDisposition) var fileName = result[1] fileName = fileName.replace(/\"/g, '') aLink.href = URL.createObjectURL(blob) aLink.setAttribute('download', fileName) // 设置下载文件名称 document.body.appendChild(aLink) aLink.click() document.body.appendChild(aLink) }
21.数组按首字母进行排序?
第一种方法: obj.sort((a,b)=>{a.pinyin.charCodeAt(0)-b.pinyin.charCodeAt(0)}) 第二种方法: sort((a,b)=>a.pinyin.localeCompare(b.pinyin))