16个必备的JavaScript代码片段

eleLink.click()

document.body.removeChild(eleLink)

}

//下载excel

download(‘http://111.229.14.189/file/1.xlsx’)

2. 在浏览器中自定义下载一些内容


场景:我想下载一些DOM内容,我想下载一个JSON文件

/**

* 浏览器下载静态文件

* @param {String} name 文件名

* @param {String} content 文件内容

*/

function downloadFile(name, content) {

if (typeof name == ‘undefined’) {

throw new Error(‘The first parameter name is a must’)

}

if (typeof content == ‘undefined’) {

throw new Error(‘The second parameter content is a must’)

}

if (!(content instanceof Blob)) {

content = new Blob([content])

}

const link = URL.createObjectURL(content)

download(link, name)

}

//下载一个链接

function download(link, name) {

if (!name) {//如果没有提供名字,从给的Link中截取最后一坨

name =  link.slice(link.lastIndexOf(‘/’) + 1)

}

let eleLink = document.createElement(‘a’)

eleLink.download = name

eleLink.style.display = ‘none’

eleLink.href = link

document.body.appendChild(eleLink)

eleLink.click()

document.body.removeChild(eleLink)

}

使用方式:

downloadFile(‘1.txt’,‘lalalallalalla’)

downloadFile(‘1.json’,JSON.stringify({name:‘hahahha’}))

3. 下载后端返回的流


数据是后端以接口的形式返回的,调用1中的download方法进行下载

download(‘http://111.229.14.189/gk-api/util/download?file=1.jpg’)

download(‘http://111.229.14.189/gk-api/util/download?file=1.mp4’)

4. 提供一个图片链接,点击下载


图片、pdf等文件,浏览器会默认执行预览,不能调用download方法进行下载,需要先把图片、pdf等文件转成blob,再调用download方法进行下载,转换的方式是使用axios请求对应的链接

//可以用来下载浏览器会默认预览的文件类型,例如mp4,jpg等

import axios from ‘axios’

//提供一个link,完成文件下载,link可以是  http://xxx.com/xxx.xls

function downloadByLink(link,fileName){

axios.request({

url: link,

responseType: ‘blob’ //关键代码,让axios把响应改成blob

}).then(res => {

const link=URL.createObjectURL(res.data)

download(link, fileName)

})

}

注意:会有同源策略的限制,需要配置转发

6 防抖


在一定时间间隔内,多次调用一个方法,只会执行一次.

这个方法的实现是从Lodash库中copy的

/**

* @param {*} func 要进行debouce的函数

* @param {*} wait 等待时间,默认500ms

* @param {*} immediate 是否立即执行

*/

export function debounce(func, wait=500, immediate=false) {

var timeout

return function() {

var context = this

var args = arguments

if (timeout) clearTimeout(timeout)

if (immediate) {

// 如果已经执行过,不再执行

var callNow = !timeout

timeout = setTimeout(function() {

timeout = null

}, wait)

if (callNow) func.apply(context, args)

} else {

timeout = setTimeout(function() {

func.apply(context, args)

}, wait)

}

}

}

使用方式:

Document

如果第三个参数immediate传true,则会立即执行一次调用,后续的调用不会在执行,可以自己在代码中试一下

7 节流


多次调用方法,按照一定的时间间隔执行

这个方法的实现也是从Lodash库中copy的

/**

* 节流,多次触发,间隔时间段执行

* @param {Function} func

* @param {Int} wait

* @param {Object} options

*/

export function throttle(func, wait=500, options) {

//container.onmousemove = throttle(getUserAction, 1000);

var timeout, context, args

var previous = 0

if (!options) options = {leading:false,trailing:true}

var later = function() {

previous = options.leading === false ? 0 : new Date().getTime()

timeout = null

func.apply(context, args)

if (!timeout) context = args = null

}

var throttled = function() {

var now = new Date().getTime()

if (!previous && options.leading === false) previous = now

var remaining = wait - (now - previous)

context = this

args = arguments

if (remaining <= 0 || remaining > wait) {

if (timeout) {

clearTimeout(timeout)

timeout = null

}

previous = now

func.apply(context, args)

if (!timeout) context = args = null

} else if (!timeout && options.trailing !== false) {

timeout = setTimeout(later, remaining)

}

}

return throttled

}

第三个参数还有点复杂,options

  • leading,函数在每个等待时延的开始被调用,默认值为false

  • trailing,函数在每个等待时延的结束被调用,默认值是true

可以根据不同的值来设置不同的效果:

  • leading-false,trailing-true:默认情况,即在延时结束后才会调用函数

  • leading-true,trailing-true:在延时开始时就调用,延时结束后也会调用

  • leading-true, trailing-false:只在延时开始时调用

例子:

Document  

8. cleanObject


去除对象中value为空(null,undefined,‘’)的属性,举个栗子:

let res=cleanObject({

name:‘’,

pageSize:10,

page:1

})

console.log(“res”, res) //输入{page:1,pageSize:10}   name为空字符串,属性删掉

使用场景是:后端列表查询接口,某个字段前端不传,后端就不根据那个字段筛选,例如name不传的话,就只根据pagepageSize筛选,但是前端查询参数的时候(vue或者react)中,往往会这样定义

export default{

data(){

return {

query:{

name:‘’,

pageSize:10,

page:1

}

}

}

}

const [query,setQuery]=useState({name:‘’,page:1,pageSize:10})

给后端发送数据的时候,要判断某个属性是不是空字符串,然后给后端拼参数,这块逻辑抽离出来就是cleanObject,代码实现如下

export const isFalsy = (value) => (value === 0 ? false : !value);

export const isVoid = (value) =>

value === undefined || value === null || value === “”;

export const cleanObject = (object) => {

// Object.assign({}, object)

if (!object) {

return {};

}

const result = { …object };

Object.keys(result).forEach((key) => {

const value = result[key];

if (isVoid(value)) {

delete result[key];

}

});

return result;

};

let res=cleanObject({

name:‘’,

pageSize:10,

page:1

})

console.log(“res”, res) //输入{page:1,pageSize:10}

剩下的8个在这里:

1. 获取文件后缀名


使用场景:上传文件判断后缀名

/**

* 获取文件后缀名

* @param {String} filename

*/

export function getExt(filename) {

if (typeof filename == ‘string’) {

return filename

.split(‘.’)

.pop()

.toLowerCase()

} else {

throw new Error(‘filename must be a string type’)

}

}

使用方式

getExt(“1.mp4”) //->mp4

2. 复制内容到剪贴板


export function copyToBoard(value) {

const element = document.createElement(‘textarea’)

document.body.appendChild(element)

element.value = value

element.select()

if (document.execCommand(‘copy’)) {

document.execCommand(‘copy’)

document.body.removeChild(element)

return true

}

document.body.removeChild(element)

return false

}

使用方式:

//如果复制成功返回true

copyToBoard(‘lalallala’)

原理:

  1. 创建一个textare元素并调用select()方法选中

  2. document.execCommand(‘copy’)方法,拷贝当前选中内容到剪贴板。

3. 休眠多少毫秒


/**

* 休眠xxxms

* @param {Number} milliseconds

*/

export function sleep(ms) {

return new Promise(resolve => setTimeout(resolve, ms))

}

//使用方式

const fetchData=async()=>{

await sleep(1000)

}

4. 生成随机字符串


/**

* 生成随机id

* @param {*} length

* @param {*} chars

*/

export function uuid(length, chars) {

chars =

chars ||

‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’

length = length || 8

var result = ‘’

for (var i = length; i > 0; --i)

result += chars[Math.floor(Math.random() * chars.length)]

return result

}

使用方式

//第一个参数指定位数,第二个字符串指定字符,都是可选参数,如果都不传,默认生成8位

uuid()

使用场景:用于前端生成随机的ID,毕竟现在的Vue和React都需要绑定key

5. 简单的深拷贝


/**

*深拷贝

* @export

* @param {*} obj

* @returns

*/

export function deepCopy(obj) {

if (typeof obj != ‘object’) {

return obj

}

if (obj == null) {

return obj

}

return JSON.parse(JSON.stringify(obj))

}

缺陷:只拷贝对象、数组以及对象数组,对于大部分场景已经足够

const person={name:‘xiaoming’,child:{name:‘Jack’}}

deepCopy(person) //new person

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值