JavaScript函数片段

发表于:2020-10-04
字数统计:6.9k 字
阅读时长:17 分钟
阅读量:355

字符串反转

var str = '123'
str.split('').reverse().join('')

数组去重

functionnoRepeat(arr){
return[...newSet(arr)];
}

查找数组最大值

functionarrayMax(arr){
returnMath.max(...arr);
}

查找数组最小值

functionarrayMin(arr){
returnMath.min(...arr);
}

查找数组最小值

functionarrayMin(arr){
returnMath.min(...arr);
}

返回已size为长度的数组分割的原数组

functionchunk(arr,size=1){
returnArray.from({
length:Math.ceil(arr.length/size),
},
(v,i)=>arr.slice(i*size,i*size+size)
);
}

检查数组中某元素出现的次数

functioncountOccurrences(arr,value){
returnarr.reduce((a,v)=>(v===value?a+1:a+0),0);
}

扁平化数组

functionflatten(arr,depth=-1){
if(depth===-1){
return[].concat(
...arr.map((v)=>(Array.isArray(v)?this.flatten(v):v))
);
}
if(depth===1){
returnarr.reduce((a,v)=>a.concat(v),[]);
}
returnarr.reduce(
(a,v)=>a.concat(Array.isArray(v)?this.flatten(v,depth-1):v),
[]
);
}

返回两个数组中不同的元素

functiondiffrence(arrA,arrB){
returnarrA.concat(arrB).filter(function(v,i,arr){
returnarr.indexOf(v)===arr.lastIndexOf(v);
});
}

返回两个数组中相同的元素

functionintersection(arr1,arr2){
returnarr2.filter((v)=>arr1.includes(v));
}

从右删除n个元素

functiondropRight(arr,n=0){
returnn<arr.length?arr.slice(0,arr.length-n):[];
}

返回数组中下标间隔nth的元素

letarr=[1,2,3,4,5,6,7,8,9]

console.log(this.everyNth(arr,2))返回[2,4,6,8]

functioneveryNth(arr,nth){
returnarr.filter((v,i)=>i%nth===nth-1);
}

返回数组中第n个元素(支持负数)

functionnthElement(arr,n=0){
return(n>=0?arr.slice(n,n+1):arr.slice(n))[0];
}

数组乱排

functionshuffle(arr){
letarray=arr;
letindex=array.length;

while(index){
index-=1;
letrandomInedx=Math.floor(Math.random()*index);
letmiddleware=array[index];
array[index]=array[randomInedx];
array[randomInedx]=middleware;
}
returnarray;
}


浏览器对象BOM

当前网页地址
functioncurrentURL(){
returnwindow.location.href;
}

获取滚动条位置

functiongetScrollPosition(el=window){
return{
x:el.pageXOffset!==undefined?el.pageXOffset:el.scrollLeft,
y:el.pageYOffset!==undefined?el.pageYOffset:el.scrollTop,
};
}

获取url中的参数

functiongetURLParameters(url){
returnurl
.match(/([^?=&]+)(=([^&]*))/g)
.reduce((a,v)=>(
(a[v.slice(0,v.indexOf("="))]=v.slice(v.indexOf("=")+1)),a
),{});
}

页面跳转,是否记录在history中

functionredirect(url,asLink=true){
asLink?(window.location.href=url):window.location.replace(url);
}

滚动条回到顶部动画

functionscrollToTop(){
constscrollTop=
document.documentElement.scrollTop||document.body.scrollTop;
if(scrollTop>0){
window.requestAnimationFrame(scrollToTop);
window.scrollTo(0,c-c/8);
}else{
window.cancelAnimationFrame(scrollToTop);
}
}

复制文本

functioncopy(str){
constel=document.createElement("textarea");
el.value=str;
el.setAttribute("readonly","");
el.style.position="absolute";
el.style.left="-9999px";
el.style.top="-9999px";
document.body.appendChild(el);
constselected=
document.getSelection().rangeCount>0?
document.getSelection().getRangeAt(0):
false;
el.select();
document.execCommand("copy");
document.body.removeChild(el);
if(selected){
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
}

检测设备类型

functiondetectDeviceType(){
return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|OperaMini/i.test(
navigator.userAgent
)?
"Mobile":
"Desktop";
}

Cookie

functionsetCookie(key,value,expiredays){
varexdate=newDate();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=
key+
"="+
escape(value)+
(expiredays==null?"":";expires="+exdate.toGMTString());
}

functiondelCookie(name){
varexp=newDate();
exp.setTime(exp.getTime()-1);
varcval=getCookie(name);
if(cval!=null){
document.cookie=name+"="+cval+";expires="+exp.toGMTString();
}
}

functiongetCookie(name){
vararr,
reg=newRegExp("(^|)"+name+"=([^;]*)(;|$)");
if((arr=document.cookie.match(reg))){
returnarr[2];
}else{
returnnull;
}
}

日期Date

时间戳转换为时间

默认为当前时间转换结果

isMs为时间戳是否为毫秒

functiontimestampToTime(timestamp=Date.parse(newDate()),isMs=true){
constdate=newDate(timestamp*(isMs?1:1000));
return`${date.getFullYear()}-${
date.getMonth()+1<10?"0"+(date.getMonth()+1):date.getMonth()+1
}-${date.getDate()}${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`;
}

文档对象DOM

/**

*固定滚动条

*功能描述:一些业务场景,如弹框出现时,需要禁止页面滚动,

*这是兼容安卓和iOS禁止页面滚动的解决方案

*/

letscrollTop=0;

functionpreventScroll(){
存储当前滚动位置
scrollTop=window.scrollY;

将可滚动区域固定定位,可滚动区域高度为0后就不能滚动了
document.body.style["overflow-y"]="hidden";
document.body.style.position="fixed";
document.body.style.width="100%";
document.body.style.top=-scrollTop+"px";
document.body.style['overscroll-behavior']='none'
}

恢复滚动

functionrecoverScroll(){
document.body.style["overflow-y"]="auto";
document.body.style.position="static";
document.querySelector('body').style['overscroll-behavior']='none'

window.scrollTo(0,scrollTop);
}

判断当前位置是否为页面底部

functionbottomVisible(){
return(
document.documentElement.clientHeight+window.scrollY>=
(document.documentElement.scrollHeight||
document.documentElement.clientHeight)
);
}

判断元素是否在可视范围内

partiallyVisible为是否为完全可见

functionelementIsVisibleInViewport(el,partiallyVisible=false){
const{
top,
left,
bottom,
right
}=el.getBoundingClientRect();

returnpartiallyVisible?
((top>0&&top<innerHeight)||
(bottom>0&&bottom<innerHeight))&&
((left>0&&left<innerWidth)||(right>0&&right<innerWidth)):
top>=0&&left>=0&&bottom<=innerHeight&&right<=innerWidth;
}


获取元素css样式

functiongetStyle(el,ruleName){
returngetComputedStyle(el,null).getPropertyValue(ruleName);
}

进入全屏

launchFullscreen(document.documentElement);
launchFullscreen(document.getElementById("id"));//某个元素进入全屏
functionlaunchFullscreen(element){
if(element.requestFullscreen){
element.requestFullscreen();
}elseif(element.mozRequestFullScreen){
element.mozRequestFullScreen();
}elseif(element.msRequestFullscreen){
element.msRequestFullscreen();
}elseif(element.webkitRequestFullscreen){
element.webkitRequestFullScreen();
}
}

退出全屏

functionexitFullscreen(){
if(document.exitFullscreen){
document.exitFullscreen();
}elseif(document.msExitFullscreen){
document.msExitFullscreen();
}elseif(document.mozCancelFullScreen){
document.mozCancelFullScreen();
}elseif(document.webkitExitFullscreen){
document.webkitExitFullscreen();
}
}

全屏事件

document.addEventListener("fullscreenchange",function(e){
if(document.fullscreenElement){
console.log("进入全屏");
}else{
console.log("退出全屏");
}
});

数字Number

数字千分位分割

functioncommafy(num){
returnnum.toString().indexOf(".")!==-1?
num.toLocaleString():
num.toString().replace(/(\d)(?=(?:\d{3})+$)/g,"$1,");
}

生成随机数

functionrandomNum(min,max){
switch(arguments.length){
case1:
returnparseInt(Math.random()*min+1,10);
case2:
returnparseInt(Math.random()*(max-min+1)+min,10);
default:
return0;
}
}

去除字符串中的html

functionremovehtml(str=''){
returnstr.replace(/<[\/\!]*[^<>]*>/ig,'')
}

防抖

debounce (fn, time) {
  let timeout = null;
  return function() {
    clearTimeout(timeout)
    timeout = setTimeout(() => {
      fn.apply(this, arguments);
    }, time);
  }
}

节流

throttle (fn, time) {
  let flag = true;
  return function() {
    if (!flag) return;
    flag = false;
    setTimeout(() => {
      fn.apply(this, arguments);
      flag = true;
    }, time);
  }
}

封装后的代码

下载地址:https://www.qiniu.lingchen.kim/utils.js

1/0