1.获取URL的query参数
- 作用:根据传入的属性名输出对应的值,没有则输出null
- 注意:url传参中包含中文时,默认的获取结果会乱码,需要进行解码
getQueryVal(key,decode = false) {
var searchObj = {}
var searchStr = window.location.search.substring(1)
var arr = searchStr.split('&')
arr.forEach(str =>{
var mark_index = str.indexOf('=')
var key = str.substring(0,mark_index)
var val = str.substring(mark_index + 1)
searchObj[key] = val
})
if (Object.prototype.hasOwnProperty.call(searchObj, key)) {
if(decode){
return decodeURI(searchObj[key])
}else{
return searchObj[key]
}
} else {
return null
}
},
2.生成最近N天的日期数组
- 由来:在做图表的时候经常需要生成最近日期列表(最近7天/15天/30天),在此封装一个,免得重复造轮子
- 语法:getDateList(天数,结束时间)
- 依赖:函数依赖moment.js,使用前请先引入
<script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
getDateList(length = 15, end_time = new Date()) {
var date_list = []
var temp_date = end_time
for (var i = 0; i < length; i++) {
date_list.unshift(`${moment(temp_date).format('MM-DD')}`)
temp_date.setDate(temp_date.getDate() - 1)
}
return date_list
},
3.生成最近的月份列表
- 由来:在做图表的时候经常需要生成最近月份列表(最近6个月/12个月),在此封装一个,免得重复造轮子。
- 语法:getMonthList(天月数,结束时间)
- 依赖:函数依赖moment.js,使用前请先引入函数依赖moment.js,使用前请先引入
<script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
getMonthList(length = 6, end_time = new Date()) {
var month_list = []
var temp_date = end_time
for (var i = 0; i < length; i++) {
date_list.unshift(`${moment(temp_date).format('YYYY-MM')}`)
temp_date.setMonth(temp_date.getMonth() - 1)
}
return month_list
},
4.根据年月输出每月天数
- 由来:制作月报表时,需要渲染当月每天的数据,就需要知道当前月有多少天
- 思路:除了2月,每个月天数都是固定的,只要判断是否是闰年还是平年即可确定2月份的天数(判断是否是闰年:年份如果是整百 则除以400取余 否则除以4取余)
getDaysByMonth(year,month){
var year = Number(year)
var month = Number(month) - 1
var days_arr = [31,28,31,30,31,30,31,31,30,31,30,31]
if ( (year%100 == 0 && year%400 == 0) || (year%100 != 0 && year%4 == 0)) {
console.log('闰年')
days_arr[1] = 29
}
return days_arr[month]
}
5.节流和防抖
- 节流含义:当一个事件被频繁触发时(滚动条滚动,鼠标移动事件),为了节省性能,降低其触发频率
- 实现方式:设定一个时间周期,一个周期内只能触发一次,以此降低其触发频率
<script>
function throttle(cb,delay){
var prev = 0
return function(){
var context = this
var args = arguments
if(Date.now() - prev >= delay){
cb && cb.apply(context,args)
prev = Date.now()
}
}
}
function handle(e){
console.log(e)
}
window.addEventListener('scroll', throttle(handle,200))
</script>
- 防抖含义:当事件频繁触发时,不执行回调,直到事件触发告一段落才执行回调,通俗的说,就是只在最后一次触发时才执行,一般用于实时输入搜索
- 实现方式:每次触发都将回调放入延时定时器中,如果定时器范围内接着触发,则清除这个定时器,并开启新的,保证永远只有一个最新的定时器执行,如果后续不再触发,则执行这个延时定时器的回调,在执行回调时,需要绑定事件发生时的context和参数
<script>
function debounce(fn, delay){
var timer = null
return function() {
var context = this
var args = arguments
clearTimeout(timer)
timer = setTimeout(function () {
fn.apply(context, args)
}, delay)
}
}
function handle(e){
console.log('handle',e)
}
window.addEventListener('resize', debounce(handle,200))
</script>
6.数组的最大值与最小值
- 实现思路:先进行数组排序,然后数组的第一个和最后一个元素就是最大值与最小值
- 注意:排序使用sort()方法进行,如果数组元素是对象,可以将p1-p2替换成p1[key]-p2[key],这样排序时可以根据数组元素的某个属性值进行比较
<script>
function getMaxMin(arr){
var max = null
var min = null
if(arr.length > 0){
var tem_arr = arr.sort((p1,p2)=>{
return p2-p1
})
max = tem_arr[0]
min = tem_arr[tem_arr.length-1]
}
return {
max,min
}
}
</script>
7.文件大小转换
- 作用:根据文件大小,为其适配一个合适的单位输出
- 实现方式:循环取商,依次提升单位("B"->"K"->"M"->"G"),直到找到最后的单位为止
<script>
function formatterSize(cellValue){
var size = cellValue
var unit = "B"
var units = ["B","K","M","G"]
while(units.length > 0 && size >= 1024){
units.shift()
unit = units[0]
size = size / 1024
}
size = Math.floor(size*100) / 100
return size + " " + unit
}
console.log(formatterSize(500))
console.log(formatterSize(1024))
console.log(formatterSize(1024 + 100))
console.log(formatterSize(1024 * 1024 * 2))
</script>
8.复制内容到粘贴版
- 核心API:document.execCommand()
function copyUrl_oz(val){
var node_textarea = document.createElement('textarea')
node_textarea.style.opacity = 0
node_textarea.value = val
document.body.appendChild(node_textarea)
node_textarea.select()
document.execCommand("Copy")
document.body.removeChild(node_textarea)
}
- 兼容性:在PC端中,测试了Chrome/火狐/edge/IE11浏览器都没问题,在手机端,测试了IOS13种的Chrome/火狐/edge浏览器,也没问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了