16个必备的JavaScript代码片段,太棒了

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) {

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

最后

正值招聘旺季,很多小伙伴都询问我有没有前端方面的面试题!

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

**

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-iMPBNxKw-1710581789928)]
[外链图片转存中…(img-Zun0DWdf-1710581789929)]
[外链图片转存中…(img-E6pTxpoz-1710581789930)]
[外链图片转存中…(img-lUbiBtGF-1710581789930)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-DNRMOMk8-1710581789930)]

最后

正值招聘旺季,很多小伙伴都询问我有没有前端方面的面试题!

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

前端资料图.PNG

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值