16个重要的JavaScript代码

简介: 16个重要的JavaScript代码
  1. 下载一个excel文档
    同时适用于word,ppt等浏览器不会默认执行预览的文档,也可以用于下载后端接口返回的流数据,见3

//下载一个链接
function download(link, name) {
if(!name){
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)
}
//下载excel
download('http://111.229.14.189/file/1.xlsx')
复制代码

  1. 在浏览器中自定义下载一些内容
    场景:我想下载一些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'}))
复制代码

  1. 下载后端返回的流
    数据是后端以接口的形式返回的,调用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')

复制代码

  1. 提供一个图片链接,点击下载
    图片、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)
     }
    

    }
    }
    复制代码
    使用方式:

<!DOCTYPE html>












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

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

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

/**

  • 节流,多次触发,间隔时间段执行
  • @param {Function} func
  • @param {Int} wait
  • @param {Object} options
    */源码地址:http://www.huayukouye.com/sitemap.html
    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:只在延时开始时调用
例子:

<!DOCTYPE html>












复制代码

  1. cleanObject
    去除对象中value为空(null,undefined,'')的属性,举个栗子:

let res=cleanObject({
name:'',
pageSize:10,
page:1
})
console.log("res", res) //输入{page:1,pageSize:10} name为空字符串,属性删掉
复制代码
使用场景是:后端列表查询接口,某个字段前端不传,后端就不根据那个字段筛选,例如name不传的话,就只根据page和pageSize筛选,但是前端查询参数的时候(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天前
|
资源调度 前端开发 JavaScript
Babel:JavaScript代码的编译利器
Babel:JavaScript代码的编译利器
|
8天前
|
JavaScript 前端开发 安全
抽象语法树(AST):理解JavaScript代码的抽象语法树
抽象语法树(AST):理解JavaScript代码的抽象语法树
|
9天前
|
JSON JavaScript 前端开发
JavaScript原生代码处理JSON的一些高频次方法合集
JavaScript原生代码处理JSON的一些高频次方法合集
|
9天前
|
存储 JavaScript 前端开发
非常实用的JavaScript一行代码(整理总结)
非常实用的JavaScript一行代码(整理总结)
34 0
|
9天前
|
JavaScript 前端开发 测试技术
如何编写JavaScript模块化代码
如何编写JavaScript模块化代码
14 0
|
8天前
|
存储 JavaScript 前端开发
掌握值类型和引用类型,让你的JavaScript代码更上一层楼!
掌握值类型和引用类型,让你的JavaScript代码更上一层楼!
|
9天前
|
JavaScript 前端开发 测试技术
编写JavaScript模块化代码主要涉及将代码分割成不同的文件或模块,每个模块负责处理特定的功能或任务
【5月更文挑战第10天】编写JavaScript模块化代码最佳实践:使用ES6模块或CommonJS(Node.js),组织逻辑相关模块,避免全局变量,封装细节。利用命名空间和目录结构,借助Webpack处理浏览器环境的模块。编写文档和注释,编写单元测试以确保代码质量。通过这些方法提升代码的可读性和可维护性。
21 3
|
9天前
|
JavaScript 前端开发 开发工具
【JavaScript 与 TypeScript 技术专栏】TypeScript 如何提升 JavaScript 代码的可读性与可维护性
【4月更文挑战第30天】TypeScript 提升 JavaScript 代码的可读性和可维护性,主要通过静态类型系统、增强代码组织、智能提示与错误检测、文档化和在大型项目中的优势。静态类型减少误解,类和接口提供结构,智能提示提高编码效率,类型注解充当内置文档。在大型项目中,TypeScript 降低理解差异,平滑迁移现有 JavaScript 项目,助力提高开发效率和项目质量。
|
9天前
|
JavaScript 前端开发 算法
< JavaScript小技巧:如何优雅的用【一行代码 】实现Js中的常用功能 >
在开发中,采用简洁的语法和结构,遵循一致的命名规范,具有良好的代码组织和注释,能很好的提高代码的质量。可读性:易于阅读和理解。清晰的命名、简洁的语法和良好的代码结构可以使代码的意图更加明确,降低理解代码的难度,提高代码的可读性。可维护性:易于维护。当代码逻辑清晰、结构简洁时,开发者可以更快速地定位和修复bug,进行功能扩展或修改。同时,可读性高的代码也有助于后续的代码重构和优化。可扩展性:更具有扩展性和灵活性。清晰的代码结构和简洁的代码风格使得添加新功能、修改现有功能或扩展代码更加容易。
< JavaScript小技巧:如何优雅的用【一行代码 】实现Js中的常用功能 >
|
9天前
|
前端开发 JavaScript 容器
JavaScript、CSS像素动画特效代码
此示例创建一个带有像素粒子的容器,每隔300毫秒就会动态添加一个新的像素粒子,然后通过CSS的关键帧动画(`@keyframes`)使它们产生上升和逐渐消失的动画效果。你可以根据需要修改像素粒子的颜色、大小、动画效果和创建速度。
14 0