general-form-storage
Version:
A form storage solution with cross-tab synchronization
3 lines (2 loc) • 1.75 kB
JavaScript
;class t{static instances=[];static isFirst=!0;static register(a){t.instances.push(a),t.isFirst&&(t.isFirst=!1,window.addEventListener("beforeunload",t.saveAll),document.addEventListener("visibilitychange",t.handleVisibilityChange))}static saveAll(){t.instances.forEach((t=>t.saveData()))}static handleVisibilityChange(){"hidden"===document.visibilityState&&t.saveAll()}}module.exports=class{constructor(a,s){this.formId=a,this.formData=s,this.storageKey=`formData_${a}`,this.channel=new BroadcastChannel("form_sync"),this.debouncedSaveData=this.debounce(this.saveData,3e3).bind(this),t.register(this),this.channel.onmessage=t=>{const{formId:a,data:s}=JSON.parse(t.data);a===this.formId?this.syncData(s):"all"===a&&this.clearData()}}init(){this.loadData()}saveData(){const t=JSON.stringify(this.formData.value);localStorage.setItem(this.storageKey,t),this.channel.postMessage(JSON.stringify({formId:this.formId,data:this.formData.value}))}debounce(t,a){let s;return function(...e){clearTimeout(s),console.log("清除了"),s=setTimeout((()=>t.apply(this,e)),a)}}loadData(){const t=JSON.parse(localStorage.getItem(this.storageKey));if(t)for(const a in t)Object.hasOwnProperty.call(this.formData.value,a)&&(this.formData.value[a]=t[a])}clearData(){localStorage.removeItem(this.storageKey),this.channel.postMessage(JSON.stringify({formId:this.formId,formData:null}))}syncData(t){if(t)for(const a in t)Object.hasOwnProperty.call(this.formData.value,a)&&(this.formData.value[a]=t[a])}static clearAll(){Object.keys(localStorage).filter((t=>t.startsWith("formData_"))).forEach((t=>localStorage.removeItem(t)));new BroadcastChannel("form_sync").postMessage(JSON.stringify({formId:"all",formData:null}))}};
//# sourceMappingURL=FormStorage.cjs.js.map