utils94
Version:
日常开发使用工具库
6 lines (5 loc) • 10.8 kB
JavaScript
let u=window.navigator.userAgent;function isIos(){return!!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)}function isAndroid(){return-1<u.indexOf("Android")||-1<u.indexOf("Adr")}function isWxApp(){return!!u.match(/MicroMessenger\/([\d.]+)/)}function isMobile(){return!!u.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)}function isPc(){return!isMobile()}function isWindows(){return-1<u.indexOf("Win")}function isMac(){return-1<u.indexOf("Mac")}let platform={isWxApp:isWxApp,isIos:isIos,isAndroid:isAndroid,isPc:isPc,isMobile:isMobile,isWindows:isWindows,isMac:isMac};var LOOP_STATUS;function getVarType(e){return Object.prototype.toString.call(e).match(/\s(\S+)]$/),RegExp.$1}function sliceArray(t,r){var n=[];for(let e=0;e<t.length;e+=r)n.push(t.slice(e,e+r));return n}function filterUrlSearch(t,e=[]){return e.forEach(e=>{e=new RegExp(e+"=([^&]*)(&|$)","gi");t=t.replace(e,"")}),t}function imageToBase64(e){var t=document.createElement("canvas");t.width=e.width,t.height=e.height;t.getContext("2d").drawImage(e,0,0,e.width,e.height);e=t.toDataURL("image/png");return e}function getBase64Img(o){return new Promise((e,t)=>{let r,n=new Image;n.crossOrigin="",n.src=o,n.onload=()=>{r=imageToBase64(n),e(r)},n.onerror=e=>{t(e)}})}function guid(){function e(){return(65536*(1+Math.random())|0).toString(16).substring(1)}return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}function flatten(e){return e.reduce((e,t)=>e.concat(Array.isArray(t)?flatten(t):t),[])}function jsonParse(e){let t=e;try{t=JSON.parse(e)}catch(e){}return t}function toString(e){return"string"==typeof e?e:JSON.stringify(e)}function fillZero(e){return e<10?"0"+e:""+e}function deepClone(r,n=new WeakMap){if("object"!=typeof r||null===r)throw new TypeError("传入参数不是对象");if(Array.isArray(r))return r.map(e=>deepClone(e,n));if(n.has(r))return n.get(r);let o={};return Object.keys(r).forEach(e=>{var t=r[e];"object"!=typeof t||null===t?o[e]=t:Array.isArray(t)?o[e]=[...t]:t instanceof Set?o[e]=new Set([...t]):t instanceof Map?o[e]=new Map([...t]):(n.set(r,r),o[e]=deepClone(t,n))}),o}function getValueByKey(e,t,r=!1){var n,t=t.replace(/\[(\d+)\]/g,".$1").split(".");let o=r?deepClone(e):e;for(n of t){if(null==o)return;o=o[n]}return o}function setValue(e,n){(Array.isArray(e)?e:[e]).forEach(e=>{var{prop:t,parse:r}=e,t=getValueByKey(n,t);e.value=r?r(t):t})}function resetObject(e){var t,r={};for(t in e){var n=e[t];Array.isArray(n)?r[t]=[]:r[t]="object"==typeof n?resetObject(n):"string"==typeof n?"":void 0}return r}async function executeAsyncQueue(e){for(;0<e.length;)await e.shift()()}function waitResult(n,e=400,o){let i=Date.now(),a=()=>new Promise((t,r)=>{o&&Date.now()-i>=o?r(new Error("timeout! timeout is "+o)):setTimeout(async()=>{try{var e=await n();t(e||a())}catch(e){r(e)}},e)});return a()}function sleep(t=5e3){return new Promise(e=>{setTimeout(()=>{e()},t)})}async function polling(c,e,l=0){let u=0,d=Date.now()+l;function f(){return new Promise((o,i)=>{if(u>=e.length)return console.log("All intervals processed. Stopping polling."),Promise.resolve();let[a,s]=e[u];return async function e(t){if(l&&Date.now()>=d)return i(new Error("Polling timed out"));await sleep(a);var{status:r,result:n}=await c();return t+=1,r===LOOP_STATUS.CONTINUE?t<s||s===1/0?e(t):(console.log(`All attempts failed at interval ${a}s. Moving to next interval.`),u+=1,f()):r===LOOP_STATUS.FINISH?o(n):void 0}(0)})}return f()}(e=>{e[e.CONTINUE=0]="CONTINUE",e[e.FINISH=1]="FINISH"})(LOOP_STATUS=LOOP_STATUS||{});let feature={getVarType:getVarType,sliceArray:sliceArray,filterUrlSearch:filterUrlSearch,getBase64Img:getBase64Img,imageToBase64:imageToBase64,guid:guid,flatten:flatten,jsonParse:jsonParse,toString:toString,fillZero:fillZero,getValueByKey:getValueByKey,setValue:setValue,deepClone:deepClone,resetObject:resetObject,executeAsyncQueue:executeAsyncQueue,polling:polling,sleep:sleep,waitResult:waitResult};class WeChat{WeChatJsSdk;shareConfig;getJsSdk;iosSdkStatus=!1;constructor(e,t,r){this.shareConfig=t,this.getJsSdk=r,this.WeChatJsSdk=e}pre(){return new Promise(async(e,t)=>{if(!isWxApp())return t("非微信环境,无需配置微信sdk");if(!!isIos()&&this.iosSdkStatus)e({});else try{var r=await this.getJsSdk();this.WeChatJsSdk.config(r),this.WeChatJsSdk.ready(()=>{this.iosSdkStatus=!0,e({})}),this.WeChatJsSdk.error(e=>{this.iosSdkStatus=!1,t(e)})}catch(e){this.iosSdkStatus=!1,t(e)}})}share(e=this.shareConfig,t){var r=e[0],e=e[1]||e[0],n=window.location.href;r.link=filterUrlSearch(r.link||n,t),e.link=filterUrlSearch(e.link||n,t),this.WeChatJsSdk.updateAppMessageShareData(r),this.WeChatJsSdk.updateTimelineShareData(e)}async autoShare(r=this.shareConfig,n){return new Promise(async(e,t)=>{try{await this.pre(),this.share(r,n),e({})}catch(e){t(e)}})}}let passiveIfSupported=!1,listenDefaultOpt={capture:!1,once:!1,passive:!0};try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>{passiveIfSupported=!0}}))}catch(e){}function isPreventDefault(e){e=e.toString().replace(/(\/\/|\/\*+)(\s)*(\w)+\.preventDefault\((\w|\s)*?\)/g,"");return/(\w)+\.preventDefault\((\w |\s)*?\)/g.test(e)}function handlerListenOpt(e,t){if(passiveIfSupported){var r=getVarType(e),t=!isPreventDefault(t);if("Boolean"===r)return{...listenDefaultOpt,capture:!!e,passive:t};if("Object"===r)return{...listenDefaultOpt,...e,passive:t}}return!!e}function on(t,r,n,o=!1){if(document.addEventListener){let e=handlerListenOpt(o,n);return t.addEventListener(r,n,e),()=>{t.removeEventListener(r,n,e)}}return t.attachEvent("on"+r,n),()=>{t.detachEvent("on"+r,n)}}function off(e,t,r,n=!1){document.removeEventListener?(n=handlerListenOpt(n,r),e.removeEventListener(t,r,n)):e.detachEvent("on"+t,r)}let dom={on:on,off:off};function assign(e){for(var t=1;t<arguments.length;t++){var r,n=arguments[t];for(r in n)e[r]=n[r]}return e}var defaultConverter={read:function(e){return(e='"'===e[0]?e.slice(1,-1):e).replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}};function init(s,i){function r(e,t,r){if("undefined"!=typeof document){"number"==typeof(r=assign({},i,r)).expires&&(r.expires=new Date(Date.now()+864e5*r.expires)),r.expires&&(r.expires=r.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var n,o="";for(n in r)r[n]&&(o+="; "+n,!0!==r[n])&&(o+="="+r[n].split(";")[0]);return document.cookie=e+"="+s.write(t,e)+o}}return Object.create({set:r,get:function(e){if("undefined"!=typeof document&&(!arguments.length||e)){for(var t=document.cookie?document.cookie.split("; "):[],r={},n=0;n<t.length;n++){var o=t[n].split("="),i=o.slice(1).join("=");try{var a=decodeURIComponent(o[0]);if(r[a]=s.read(i,a),e===a)break}catch(e){}}return e?r[e]:r}},remove:function(e,t){r(e,"",assign({},t,{expires:-1}))},withAttributes:function(e){return init(this.converter,assign({},this.attributes,e))},withConverter:function(e){return init(assign({},this.converter,e),this.attributes)}},{attributes:{value:Object.freeze(i)},converter:{value:Object.freeze(s)}})}var api=init(defaultConverter,{path:"/"});class BrowserStorage{target;constructor(e){this.target=e}get(e){e=this.target.getItem(e);return e&&jsonParse(e)}set(e,t){this.target.setItem(e,toString(t))}remove(e){this.target.removeItem(e)}clear(){this.target.clear()}}let LocalStorage=new BrowserStorage(window.localStorage),SessionStorage=new BrowserStorage(window.sessionStorage),CookieStorage={get:e=>{e=api.get(e);return e&&jsonParse(e)},set:(e,t,r={})=>{api.set(e,toString(t),r)},remove:(e,t={})=>{api.remove(e,t)}},storage={BrowserStorage:BrowserStorage,LocalStorage:LocalStorage,SessionStorage:SessionStorage,CookieStorage:CookieStorage};function _date(e){return e instanceof Date?e:("string"==typeof e&&(e=e.replace("-","/")),new Date(e))}function getYMDW(e){var[e,t,r,n]=[(e=_date(e)).getFullYear(),e.getMonth()+1,e.getDate(),e.getDay()];return{year:e,month:t,day:r,week:n}}function _weeks(t){var e=[0,1,2,3,4,5,6],r=e.findIndex(e=>e===t),n=e.splice(r,e.length),e=e.splice(0,r);return[...n,...e]}function getStartMend(t,r){var e=_weeks(r),n=e.findIndex(e=>e===t),e=e.findIndex(e=>e===r);return Math.abs(e-n)}function getEndMend(t,e){e=_weeks(e);let r=e.findIndex(e=>e===t);return e.filter((e,t)=>t>r).length}function createMonth({date:e,data:t,weekStart:r,isSliceByWeek:n}={}){r=r??1;var e=_date(e||Date.now()),o=r-1<0?6:r-1,i=e.getFullYear(),a=e.getMonth(),s=a+1,c=a+1,l=e.getDate(),u=new Date(i,c,0).getDate(),d=[];for(let e=1;e<=u;e++){var f=e,g=new Date(i,a,f).getDay();if(1===e)if(r!==g)for(let e=getStartMend(g,r);0<e;e--){var p=new Date(i,a,1-e),h=getYMDW(p),y=`${h.year}/${fillZero(h.month)}/`+fillZero(h.day);d.push({source:p,text:y,current:!1,week:h.week,year:h.year,month:h.month,day:h.day,isToday:!1,data:t?.[y]})}var S=`${i}/${fillZero(s)}/`+fillZero(f);if(d.push({current:!0,text:S,isToday:f===l,source:new Date(i,a,f),data:t?.[S],week:g,day:f,month:a,year:i}),e===u&&g!==o){var w=getEndMend(g,r);for(let e=0;e<w;e++){var m=new Date(i,c,e+1),v=getYMDW(m),C=`${v.year}/${fillZero(v.month)}/`+fillZero(v.day);d.push({source:m,text:C,current:!1,data:t?.[C],week:v.week,year:v.year,month:v.month,day:v.day,isToday:!1})}}}return n?sliceArray(d,7):d}function checkOverlap(e){let t=[],r=[],n=!1;e.forEach(e=>{t.push(e.s),r.push(e.e)}),t=t.sort((e,t)=>e-t),r=r.sort((e,t)=>e-t);for(let e=1;e<t.length;e++)if(t[e]<r[e-1]){n=!0;break}return n}let date={createMonth:createMonth,checkOverlap:checkOverlap,getYMDW:getYMDW,getStartMend:getStartMend,getEndMend:getEndMend};async function copy(e){try{var t;return navigator.clipboard?await navigator.clipboard.writeText(e):(t=document.createElement("textarea"),document.body.appendChild(t),t.style.cssText=`
position: fixed;
top:-1000vh;
opacity:0;
`,t.value=e,t.select(),document.execCommand("copy"),document.body.removeChild(t)),!0}catch(e){return console.error(e),!1}}function setWindowTitle(e){if(document.title=e,isIos()||isMac()||isWxApp()){let e=document.createElement("iframe");e.style.display="none",e.onload=()=>{setTimeout(()=>{document.body.removeChild(e)},0)},document.body.appendChild(e)}}let bom={copy:copy,setWindowTitle:setWindowTitle};export{CookieStorage,LOOP_STATUS,LocalStorage,SessionStorage,WeChat,bom,checkOverlap,copy,createMonth,date,deepClone,dom,executeAsyncQueue,feature,fillZero,filterUrlSearch,flatten,getBase64Img,getEndMend,getStartMend,getValueByKey,getVarType,getYMDW,guid,imageToBase64,isAndroid,isIos,isMac,isMobile,isPc,isWindows,isWxApp,jsonParse,off,on,platform,polling,resetObject,setValue,setWindowTitle,sleep,sliceArray,storage,toString,waitResult};