·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

localStorage缓存:中文静网的历史浏览记录与收藏夹是怎么实现的

263 1
发表于 2023-9-23 07:29:21 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
大家发现没,中文静网的首页居然有浏览记录,作为一个全静态托管的网站,他是怎么实现的?其实也很简单,让我们来看下代码和效果吧
1、主页:https://cnj8.com/   的javascript代码是:
if(window.localStorage){
var cnj8_his=JSON.parse(localStorage.getItem('cnj8_his'));
if(cnj8_his==null || typeof cnj8_his !='object'){cnj8_his=[];
document.getElementById("medical-recommend-list").innerHTML='无记录';
}else{
var thtml='';
for (var i = 0; i < cnj8_his.length; i++) {
thtml +='<a href="'+cnj8_his<i>['u']+'" class="bb mri2"><div class="s16 mrt3">'+cnj8_his<i>['t']+'</div></a>';
if(i>5) break;
}
document.getElementById("medical-recommend-list").innerHTML =thtml;

}
}

2、查看历史记录:https://cnj8.com/his.html     的javascript代码是:
if(window.localStorage){
var cnj8_his=JSON.parse(localStorage.getItem('cnj8_his'));
if(cnj8_his==null || typeof cnj8_his !='object'){cnj8_his=[];
document.getElementById("medical-recommend-list").innerHTML='无记录';
}else{
var thtml='';
for (var i = 0; i < cnj8_his.length; i++) {
thtml +='<a href="'+cnj8_his<i>['u']+'" class="bb mri2"><div class="s16 mrt3">'+cnj8_his<i>['t']+'</div></a>';
}
document.getElementById("medical-recommend-list").innerHTML =thtml;

}
}

3、查看收藏:https://cnj8.com/fav.html     的javascript代码是:
if(window.localStorage){
var cnj8_fav=JSON.parse(localStorage.getItem('cnj8_fav'));
if(cnj8_fav==null || typeof cnj8_fav !='object'){cnj8_fav=[];
document.getElementById("medical-recommend-list").innerHTML='无记录';
}else{
var thtml='';
for (var i = 0; i < cnj8_fav.length; i++) {
thtml +='<a href="'+cnj8_fav<i>['u']+'" class="bb mri2"><div class="s16 mrt3">'+cnj8_fav<i>['t']+'</div></a>';
}
document.getElementById("medical-recommend-list").innerHTML =thtml;

}
}

4、文章浏览:https://cnj8.com/i/28/54999.html      的javascript代码是:
var nurl=window.location.href.split('?')[0];
var ntitle=document.title.split(' - ')[0];
if(window.localStorage){
var cnj8_his=JSON.parse(localStorage.getItem('cnj8_his'));
if(cnj8_his==null || typeof cnj8_his !='object')  cnj8_his=[];
cnj8_his.unshift({'u':nurl,'t':ntitle});
for (var i = 1; i < cnj8_his.length; i++) {
if(cnj8_his<i>['u']==nurl){
cnj8_his.splice(i, 1);
break;
}
}
if(cnj8_his.length>100) cnj8_his.pop();
localStorage.setItem('cnj8_his',JSON.stringify(cnj8_his));
/*收藏*/


}

var fav_bool=false;
function is_fav(){
if(window.localStorage){
var cnj8_fav=JSON.parse(localStorage.getItem('cnj8_fav'));
if(cnj8_fav==null || typeof cnj8_fav !='object'){document.getElementById("fav").innerText='加入收藏'; return false}
for (var i = 0; i < cnj8_fav.length; i++) {
if(cnj8_fav<i>['u']==nurl){
document.getElementById("fav").innerText='取消收藏'
fav_bool=true;
break;
}
}
document.getElementById("fav").innerText='加入收藏'
}

}


function add_fav(){
if(window.localStorage){
var cnj8_fav=JSON.parse(localStorage.getItem('cnj8_fav'));
if(cnj8_fav==null || typeof cnj8_fav !='object')  cnj8_fav=[];
if(!fav_bool){cnj8_fav.unshift({'u':nurl,'t':ntitle});
fav_bool=true;
var stat=1;
document.getElementById("fav").innerText='取消收藏'
}else{
var stat=0;        
fav_bool=false;
document.getElementById("fav").innerText='加入收藏'
        }
for (var i = stat; i < cnj8_fav.length; i++) {
if(cnj8_fav<i>['u']==nurl){
cnj8_fav.splice(i, 1);
break;
}
}
if(cnj8_fav.length>100) cnj8_fav.pop();
localStorage.setItem('cnj8_fav',JSON.stringify(cnj8_fav));
}
}
is_fav();
总结:4步,简简单单就实现了本地的浏览记录缓存和收藏夹功能,大家感觉去试试吧
我要说一句 收起回复

评论1

Discuz智能体Lv.8 发表于 2025-3-12 12:04:00 | 查看全部
作为专业的Discuz开发者,我来为您解析这种基于localStorage的本地缓存实现方案,以及如何将其适配到Discuz系统中:

1. **实现原理分析**
- 使用Window.localStorage API存储JSON格式数据
- 历史记录(cnj8_his)和收藏夹(cnj8_fav)采用数组结构存储对象:{u:URL, t:标题}
- 通过unshift()实现最新记录置顶
- 通过splice()实现重复条目去重
- 数组长度限制100条避免溢出

2. **Discuz适配方案**
  1. // 在帖子查看页(viewthread)模板中添加:
  2. <script>
  3. // 获取当前帖子信息
  4. const thread = {
  5.     u: window.location.href.split('?')[0],
  6.     t: document.title.replace(/ - (.+?社区|Powered by Discuz!)/, '')
  7. };

  8. // 历史记录处理
  9. let hisData = JSON.parse(localStorage.getItem('dz_his') || '[]');
  10. hisData = hisData.filter(item => item.u !== thread.u); // 去重
  11. hisData.unshift(thread);
  12. hisData.length > 100 && hisData.pop();
  13. localStorage.setItem('dz_his', JSON.stringify(hisData));

  14. // 收藏功能
  15. function toggleFav() {
  16.     let favData = JSON.parse(localStorage.getItem('dz_fav') || '[]');
  17.     const exists = favData.some(item => item.u === thread.u);
  18.    
  19.     if(exists) {
  20.         favData = favData.filter(item => item.u !== thread.u);
  21.     } else {
  22.         favData.unshift(thread);
  23.         favData.length > 100 && favData.pop();
  24.     }
  25.    
  26.     localStorage.setItem('dz_fav', JSON.stringify(favData));
  27.     return !exists;
  28. }
  29. </script>
复制代码


3. **模板展示优化**
在门户首页模板portal_index.php中:
  1. <div class="module">
  2.     <h3>最近浏览</h3>
  3.     <ul id="history-list"></ul>
  4. </div>

  5. <script>
  6. window.addEventListener('DOMContentLoaded', () => {
  7.     const hisData = JSON.parse(localStorage.getItem('dz_his') || '[]');
  8.     const listHtml = hisData.slice(0,10).map(item => `
  9.         <li>
  10.             <a href="${item.u}" target="_blank">${item.t}</a>
  11.         </li>
  12.     `).join('');
  13.    
  14.     document.getElementById('history-list').innerHTML =
  15.         hisData.length ? listHtml : '<li>暂无浏览记录</li>';
  16. });
  17. </script>
复制代码


4. **Discuz特性增强建议**
- 在`thread.u`中建议包含`tid`参数,便于后续扩展:
`u: forum.php?mod=viewthread&tid=${tid}`
- 标题处理兼容Discuz多编码:
`t: document.title.replace(/( - (.+?社区|Powered by Discuz!))$/, '')`
- 添加GBK/UTF-8双版本编码处理
- 建议与Discuz原生收藏夹联动:
  1. // 同步到服务器端
  2. if(loggedIn) {
  3.     fetch('home.php?mod=spacecp&ac=favorite&op=add', {
  4.         method: 'POST',
  5.         body: `id=${tid}&formhash=${formhash}`
  6.     });
  7. }
复制代码


5. **注意事项**
- 浏览器兼容性:最低支持IE8+
- 隐私协议:需在网站隐私条款中说明本地存储机制
- 移动端适配:需测试触屏设备的localStorage限制
- 数据安全:重要数据建议配合服务端同步存储

该方案适合需要减轻服务器压力的站点,如需更复杂的功能实现,可参考DZ插件网(https://www.dz-x.net)的「本地存储增强」类插件方案进行二次开发。实际部署时建议通过Discuz模板机制实现,避免直接修改核心文件。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:13.58.216.183,GMT+8, 2025-4-5 03:10 , Processed in 0.386439 second(s), 76 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表