HTML无内置成就隐藏/公开机制,实际依赖JavaScript控制DOM+后端存储状态+用户登录态;前端仅样式隐藏不安全,须服务端同步权限并初始渲染真实可见性。

HTML 本身没有“成就隐藏/重新公开”机制
浏览器里的 HTML 是纯静态标记语言,不保存用户状态,也不内置“成就系统”或“隐私开关”。所谓“隐藏后恢复”,实际依赖的是外部逻辑:JavaScript 控制 DOM 显示/隐藏 + 后端存储用户操作记录 + 用户登录态识别。如果你在某个网站看到“重新公开”按钮,它触发的不是 HTML 标签变更,而是向服务器发请求更新该用户的成就可见性状态。
用 display 或 visibility 临时隐藏成就元素(前端仅视觉)
这是最常见但最容易误解的做法——只改样式,不改数据权限。用户仍可通过开发者工具查看 HTML 源码、禁用 CSS 或直接请求接口拿到原始数据。
-
display: none:元素彻底从渲染树移除,无法被聚焦、读屏器忽略,但 DOM 节点仍在 -
visibility: hidden:占位还在,只是不可见,可能意外暴露结构 - 别用
opacity: 0配合pointer-events: none模拟隐藏——键盘仍可 tab 进去,无障碍体验差
示例:
<div id="achievement-vip" class="achievement" style="display: none;">VIP 成就</div>
“重新公开”按钮必须绑定真实状态同步逻辑
点击“重新公开”时,如果只改前端样式,等于没做。关键是要让这个动作产生服务端副作用,并反馈结果。
- 按钮需有唯一标识,比如
data-achievement-id="vip_2024" - 点击后应调用
fetch('/api/achievements/vip_2024/public', { method: 'PUT' }),而非仅执行el.style.display = 'block' - 接口返回成功后,再更新 DOM;失败则保留隐藏状态并提示用户(例如显示
"同步失败,请重试") - 若用户未登录,
fetch很可能直接 401,此时“重新公开”按钮应禁用或灰显
真正决定“是否可见”的地方不在 HTML,而在服务端响应或初始数据注入
最稳妥的方式,是让 HTML 初始渲染就反映真实权限。比如后端模板(如 EJS、Django 模板)根据当前用户权限决定是否输出该成就区块:
<br><div class="achievement">VIP 成就</div><br>
这样连“隐藏再恢复”的前端逻辑都省了——用户看不到,是因为服务器压根没发过去。而“重新公开”按钮的存在,本质是给用户一个发起权限变更请求的入口,不是操控 HTML 的开关。
容易被忽略的一点:成就状态变更往往需要广播通知其他页面(比如个人主页、成就墙、侧边栏徽章),不能只刷新当前 DOM 块。这通常靠事件总线或 localStorage + storage 事件触发跨标签页同步。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











