mahmud-js-tools
Version:
一个简单而实用的JavaScript工具库,包含多种常用的工具函数。
13 lines (12 loc) • 5.79 kB
JavaScript
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).JsBooster={})}(this,(function(t){"use strict";
/**
* js-booster - High-performance frontend library
* VirtualScroll - Virtual scrolling implementation
* @version 1.1.1
* @license MIT
*/class e{constructor(t){this.container=t.container,this.items=t.items||[],this.itemHeight=t.itemHeight||20,this.bufferSize=t.bufferSize||10,this.customRenderItem=t.renderItem,this.customRenderHeader=t.renderHeader,this.maxHeight=t.maxHeight||2684e4,this.visibleStartIndex=0,this.visibleEndIndex=0,this.scrollContainer=null,this.contentWrapper=null,this.contentContainer=null,this.totalHeight=this.items.length*this.itemHeight,this.heightScale=1,this.totalHeight>this.maxHeight&&(this.heightScale=this.maxHeight/this.totalHeight),this.initialize()}initialize(){if(this.container.innerHTML="",this.scrollContainer=document.createElement("div"),Object.assign(this.scrollContainer.style,{flex:"1",overflow:"auto",position:"relative",minHeight:"0",height:"100%",boxSizing:"border-box"}),this.customRenderHeader){const t=this.customRenderHeader();t&&this.scrollContainer.appendChild(t)}this.contentWrapper=document.createElement("div"),Object.assign(this.contentWrapper.style,{position:"relative",width:"100%"});const t=this.totalHeight*this.heightScale;this.contentWrapper.style.height=`${t}px`,this.contentContainer=document.createElement("div"),Object.assign(this.contentContainer.style,{position:"absolute",width:"100%",left:"0"}),this.scrollContainer.addEventListener("scroll",this.handleScroll.bind(this)),this.contentWrapper.appendChild(this.contentContainer),this.scrollContainer.appendChild(this.contentWrapper),this.container.appendChild(this.scrollContainer),this.renderVisibleItems(0,Math.min(100,this.items.length))}handleScroll(){const t=this.scrollContainer.scrollTop,e=this.scrollContainer.clientHeight,i=t/this.heightScale,n=Math.max(0,Math.floor(i/this.itemHeight)-this.bufferSize),s=Math.min(this.items.length,Math.ceil((i+e/this.heightScale)/this.itemHeight)+this.bufferSize);n===this.visibleStartIndex&&s===this.visibleEndIndex||(this.renderVisibleItems(n,s),this.visibleStartIndex=n,this.visibleEndIndex=s)}renderVisibleItems(t,e){this.contentContainer.innerHTML="",this.contentContainer.style.transform=`translateY(${t*this.itemHeight*this.heightScale}px)`;for(let i=t;i<e;i++){const t=this.items[i];if(this.customRenderItem){const e=this.customRenderItem(t,i);e&&(e.style.height=this.itemHeight*this.heightScale+"px",e.style.boxSizing="border-box",e.style.width="100%",this.contentContainer.appendChild(e))}else{const e=document.createElement("div");Object.assign(e.style,{height:this.itemHeight*this.heightScale+"px",width:"100%",boxSizing:"border-box",padding:"8px",borderBottom:"1px solid #eee"}),e.textContent=JSON.stringify(t),this.contentContainer.appendChild(e)}}}updateItems(t){this.items=t||[],this.totalHeight=this.items.length*this.itemHeight,this.heightScale=1,this.totalHeight>this.maxHeight&&(this.heightScale=this.maxHeight/this.totalHeight),this.contentWrapper&&(this.contentWrapper.style.height=this.totalHeight*this.heightScale+"px"),this.visibleStartIndex=0,this.visibleEndIndex=0,this.handleScroll()}scrollToIndex(t){t>=0&&t<this.items.length&&(this.scrollContainer.scrollTop=t*this.itemHeight*this.heightScale)}destroy(){this.scrollContainer&&this.scrollContainer.removeEventListener("scroll",this.handleScroll),this.container&&(this.container.innerHTML=""),this.items=null,this.container=null,this.scrollContainer=null,this.contentWrapper=null,this.contentContainer=null}refresh(){this.handleScroll()}getScrollContainer(){return this.scrollContainer}}
/**
* js-booster - Utility functions
* @version 1.1.1
* @license MIT
*/var i=Object.freeze({__proto__:null,deepClone:function t(e){if(null===e||"object"!=typeof e)return e;if(e instanceof Date)return new Date(e);if(e instanceof RegExp)return new RegExp(e);const i=Array.isArray(e)?[]:{};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&(i[n]=t(e[n]));return i},cloneArray:function(t){return t.slice()},debounce:function(t,e){let i;return function(...n){clearTimeout(i),i=setTimeout((()=>t.apply(this,n)),e)}},isEqual:function t(e,i){if(e===i)return!0;if("object"!=typeof e||"object"!=typeof i||null===e||null===i)return!1;const n=Object.keys(e),s=Object.keys(i);if(n.length!==s.length)return!1;for(const r of n)if(!s.includes(r)||!t(e[r],i[r]))return!1;return!0},throttle:function(t,e){let i,n;return function(...s){n?(clearTimeout(i),i=setTimeout((()=>{Date.now()-n>=e&&(t.apply(this,s),n=Date.now())}),e-(Date.now()-n))):(t.apply(this,s),n=Date.now())}},random:function(t,e){return Math.floor(Math.random()*(e-t+1))+t},formatTime:function(t,e="YYYY-MM-DD HH:mm:ss"){const i=new Date(t),n={YYYY:i.getFullYear(),MM:String(i.getMonth()+1).padStart(2,"0"),DD:String(i.getDate()).padStart(2,"0"),HH:String(i.getHours()).padStart(2,"0"),mm:String(i.getMinutes()).padStart(2,"0"),ss:String(i.getSeconds()).padStart(2,"0")};return e.replace(/YYYY|MM|DD|HH|mm|ss/g,(t=>n[t]))},isUrl:function(t){try{return new URL(t),!0}catch{return!1}},unique:function(t){return[...new Set(t)]},capitalize:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},camelCase:function(t){return t.replace(/[-_\s]+(.)?/g,((t,e)=>e?e.toUpperCase():""))},shuffle:function(t){const e=[...t];for(let t=e.length-1;t>0;t--){const i=Math.floor(Math.random()*(t+1));[e[t],e[i]]=[e[i],e[t]]}return e},sleep:function(t){return new Promise((e=>setTimeout(e,t)))}});"undefined"!=typeof window&&(window.JsBooster={VirtualScroll:e,...i}),t.VirtualScroll=e,t.utils=i,Object.defineProperty(t,"__esModule",{value:!0})}));