在前端如何使用jquery.storageapi.min.js缓存数据

本文介绍了一种在多页面跳转中利用前端缓存插件(jquery.storageapi.min.js)存储和传递数据的方法,以实现人员选择功能。通过缓存数据,解决了重定向时数据无法直接传递的问题。

正常情况下,页面的跳转我们都是喜欢通过Controller跳转(请求转发),然后让Model、ModelAndView(SpringMVC框架)、request等将数据带到页面去。但是如果项目中需要是直接跳转呢(重定向)。那么,数据只能跟着URL后面带着过去了,那如果数据是一个表单的数据呢,那URL是非常的长而且不美观的,加上GET提交的数据是有限制的,因为浏览器对URL的长度有限制,那么数据跟着URL直接带过去就不现实了,但是我们可以用到前端的缓存呀,使用的缓存插件就是jquery.storageapi.min.js。

下面我将讲一下场景和我是怎么使用的。

场景:

  1. 点击机构,进入机构的用户列表,可以进行多选
  2. 点击已选,可以进入查看已选人员,可以进行取消,或在已选里面再选
  3. 点击确定,返回人员数据(人员选择页面没有确定,自己添加)
  4. 因为有多个页面跳转,选择人员的数据先存在页面缓存中,选中和取消选择都需要对缓存数据进行操作
  5. 缓存使用jquery.storageapi.min.js
  6. 需要可以回显(其实回显就是用到缓存,不然实现不了)
  7. 用户选择页面其实和已选择弹出的页面是一样的,展示用户。只是用户选择页面是根据点击的机构id查询出来用户列表。而已选择页面是列出已选择的用户列表,但是相同的是两个页面都可以多选,然后点击确定提交数据返回到组织机构选择页面。

 

导入js:jquery-1.8.2.min.js和jquery.storageapi.min.js

需要注意的是,需要新建一个使用缓存的js(userSelect.js),每个页面都需要引入这个js,而且还需要引用jquery-1.8.2.min.js和jquery.storageapi.min.js。因为公用一个js,storage对象才是全局的,缓存才能共享。

下面看一下userSelect.js的代码。

/**
* 使用此js的方法记得页面一定得引入jquery和jquery.storageapi.min.js
* Howinfun
* 2018-07-18
*/

/**
* 人员选择页面(组织机构页面跳转到人员选择页面)
*checkData:这个是缓存的人员数据
* departId:点击的组织机构id
* departName:点击的组织机构name
*/
function userSelect(checkData,departId,departName){

    var storage = getStorage();
    var checkKey = newGuid();
    storage.set(checkKey, checkData);
    //这个跳转到人员选择页面
    window.location.href = "mobile.do?        webcontent/index&page=user_select&checkKey="+checkKey+"&dId="+departId+"&departName="+departName;

}

/**
* 组织选择页面(人员选择页面(或已选人员页面)跳转到组织机构页面)
* checkData:这个是缓存的人员数据
*/
function orgSelect(checkData){

    var storage = getStorage();
    var checkKey = newGuid();
    storage.set(checkKey, checkData);
    //这个跳转到组织选择页面
    window.location.href = "mobile.do?webcontent/index&page=org_select&checkKey="+checkKey;

}

/**
* 已选人员页面(组织机构页面跳转到已选人员页面)
* checkData:这个是缓存的人员数据
*/
function checkUser(checkData){

    var storage = getStorage();
    var checkKey = newGuid();
    storage.set(checkKey, checkData);
    //这个跳转到已选人员页面
    window.location.href = "mobile.do?webcontent/index&page=checkUser&checkKey="+checkKey;

}

/**
* 缓存对象(在此js中是全局的)
*/
var storage = null;
function getStorage(){
    if(storage == null){
        storage = $.localStorage;
        if (!storage)
            storage = $.cookieStorage;
    }
    return storage;
}

/**
* 获取guid作为缓存的key值
*/
function newGuid() {
    var guid = "";
    for (var i = 1; i <= 32; i++) {
        var n = Math.floor(Math.random() * 16.0).toString(16);
        guid += n;
        if ((i == 8) || (i == 12) || (i == 16) || (i == 20)) guid += "-";
    }
    return guid;
}

/**
* 从缓存获取数据,并删除数据
*/
function getAndRemoveStorageVal(key){
    var storage = getStorage();
    val = storage.get(key);
    storage.remove(key);
    return val;
}

 

 

<think>好的,用户想要用jQuery前端实现一个用户无法轻易删除的缓存,即使更换浏览器也能存在。首先,我需要明确,仅使用前端的话,数据存储的持久性和跨浏览器的能力是有限的,因为前端存储通常受同源策略和浏览器存储机制的限制,用户可以通过清除浏览器数据或使用隐私模式来删除。 接下来,用户提到“即使用户更换浏览器也存在”,这似乎要求数据能在不同浏览器间同步,但前端无法做到这一点,因为不同浏览器的存储是隔离的。可能需要更深入理解用户的需求,可能他们希望即使用户更换设备或浏览器,数据仍然存在,但仅凭前端技术无法实现,需要后端配合。不过用户明确说明“只用前端”,所以必须排除服务器方案。 常见的浏览器存储方式有Cookie、LocalStorage、SessionStorage、IndexedDB等。其中,LocalStorage和Cookie是常用的持久化存储方式,但用户都可以手动清除。尤其是Cookie,如果设置过期时间,可以长期存在,但用户仍然可以删除。 另外,有些浏览器支持Service Worker和Cache API,可以用来缓存数据,但同样可能被清除。 考虑到用户希望“无法轻易删除”,可能需要结合多种存储方式,增加清除的难度。比如同时使用Cookie、LocalStorage、IndexedDB,甚至利用浏览器指纹来存储数据,但跨浏览器仍然不可能。 不过,用户可能误解了前端存储的能力,需要明确告知前端无法实现跨浏览器持久化存储,只能尽可能增加用户删除的难度,但无法完全防止。最优方案可能是结合多种存储方式,并在检测到数据被删除时尝试恢复,但这也有局限性。 例如,可以同时将数据存储在Cookie(设置长期过期时间)、LocalStorage、IndexedDB,甚至使用Web SQL(尽管已废弃),同时利用浏览器指纹生成唯一标识,但跨浏览器的话,指纹不同,无法共享数据。 总结:前端无法实现跨浏览器的持久化存储,只能通过多种存储方式组合,增加用户删除的难度。方案可能包括使用所有可用的存储机制,并定期同步数据,但用户仍有权清除所有数据。</think>根据前端技术限制及浏览器安全策略,纯前端无法实现真正的永久性跨浏览器存储。但可通过以下方案最大限度提高数据留存能力: 实现方案(纯前端): ```html <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> // 生成浏览器指纹(简化版) function generateFingerprint() { return btoa(navigator.userAgent + navigator.platform + screen.width + screen.height + navigator.language) } // 多层存储策略 function setSuperStorage(key, value) { try { // 第一层:LocalStorage localStorage.setItem(key, value) // 第二层:IndexedDB const request = indexedDB.open('persistentDB', 1) request.onupgradeneeded = (e) => { const db = e.target.result if (!db.objectStoreNames.contains('secureStore')) { db.createObjectStore('secureStore') } } request.onsuccess = (e) => { const db = e.target.result const tx = db.transaction('secureStore', 'readwrite') tx.objectStore('secureStore').put(value, key) } // 第三层:Cookie(设置10年有效期) document.cookie = `${key}=${value}; expires=${new Date(Date.now()+315360000000).toUTCString()}; path=/` // 第四层:SessionStorage(页面关闭后自动恢复) sessionStorage.setItem(key, value) // 第五层:浏览器缓存(Service Worker) if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js').then(reg => { caches.open('persistentCache').then(cache => { cache.put(new Request(`/cache/${key}`), new Response(value)) }) }) } } catch (e) { console.error('Storage failed:', e) } } // 数据恢复机制 function checkDataConsistency(key) { const sources = { localStorage: localStorage.getItem(key), cookie: document.cookie.match(new RegExp(`${key}=([^;]+)`))?.[1], sessionStorage: sessionStorage.getItem(key) } // 自动修复机制 const validValue = Object.values(sources).find(v => v) if (validValue) { setSuperStorage(key, validValue) // 重新同步所有存储层 return validValue } return null } // 使用示例 $(document).ready(() => { const fingerprint = generateFingerprint() const storedData = checkDataConsistency('userData') || setSuperStorage('userData', '重要数据') }) </script> ``` 实现原理说明: 1. 多层存储策略:同时使用5种存储机制,增加清除难度 2. 数据一致性检查:定期验证各存储层数据,自动修复丢失的数据 3. 浏览器指纹:通过硬件/软件特征生成唯一标识(实际应用中需更复杂算法) 4. Service Worker:注册后台进程保持缓存活跃 各存储层清除难度(从易到难): 1. SessionStorage ★☆ 2. Cookie ★★☆ 3. LocalStorage ★★★ 4. IndexedDB ★★★☆ 5. Service Worker缓存 ★★★★ 注意事项: 1. 无法真正跨浏览器:不同浏览器的存储相互隔离 2. 隐私模式失效:隐私模式下大部分存储机制不可用 3. 存储空间限制:各浏览器对存储总量有限制(通常2.5MB-10MB) 4. 用户仍可通过「清除浏览数据」完全删除 建议:如需真正持久化存储,必须结合后端服务进行数据同步,通过用户认证实现跨设备/浏览器访问。纯前端方案只能作为临时存储增强方案使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值