正确做法是只存表情包 src 地址和可选描述,用数组+json.stringify()保存;添加前json.parse取出、去重再写入;url需encodeuricomponent()编码;注意5–10mb限制并try/catch捕获;动态内容须事件委托;收藏页渲染用set去重;safari长按保存需用户手势触发a.click()。

怎么用 localStorage 存表情包 URL 而不崩
直接存整个 img 标签字符串或 DOM 对象会失败——localStorage 只接受字符串,且不能存函数、DOM 节点等非可序列化值。正确做法是只存表情包的 src 地址(如 "https://emoticon.example/laugh.webp")和可选的描述,用数组 + JSON.stringify() 保存。
- 每次添加前先
JSON.parse(localStorage.getItem("favEmojis"))拿出当前列表,去重再写入,避免重复收藏 - 注意 URL 编码问题:含中文或特殊符号的链接要先
encodeURIComponent()再存,读取时decodeURIComponent() - 单个 value 有 5–10MB 限制(实际约 4.8MB),超量会触发
QuotaExceededError,建议加try/catch捕获
点击图片就收藏?绑定事件别漏掉动态内容
如果表情包列表是异步加载(比如从 API 或 JSON 文件读取),直接用 document.querySelectorAll(".emoji-img").forEach(...) 绑定事件会失效——新插入的节点没监听器。必须用事件委托。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 在父容器(如
id="emoji-grid")上监听click,检查e.target.matches(".emoji-img") - 别用
onclick属性写法,它无法传参,也不利于解绑 - 收藏按钮建议用独立
button元素(带data-src),比直接点img更可控、可访问性更好
渲染收藏页时怎么避免重复请求同一张图
反复调用 new Image().src = url 或直接插入多个相同 src 的 img 标签,浏览器通常会复用缓存,但首次加载仍可能抖动。更稳的方式是提前预加载关键表情,并统一用 loading="lazy" 控制时机。
- 收藏页渲染时,对每个
src做简单去重:用Set过滤后再生成img列表 - 不要在循环里反复设置
img.onerror,应统一用事件委托监听error,然后移除坏链接 - 本地文件(
file://协议)下部分 WebP/AVIF 表情可能不显示,优先用 HTTPS 地址或 fallback 到 PNG
移动端长按保存图片功能怎么兼容 Safari
Safari 对 canvas.toBlob() 和 download 属性支持差,长按保存常失效。绕过方式是生成临时 a 链接并模拟点击,但需注意 iOS 限制:只有用户手势触发的点击才允许下载。
- 必须在
touchend或click回调内调用a.click(),不能异步延迟(比如放在setTimeout里) - 对于跨域表情图,
canvas会污染,无法读取像素,此时只能跳转新窗口打开原图,由用户手动“分享→保存图像” - Android Chrome 支持
download属性,但 Safari 完全忽略,检测navigator.userAgent.includes("Safari") && !navigator.userAgent.includes("Chrome")做分支处理
src、302 重定向后跨域、iOS 上 touchstart/touchend 事件丢失。留个心眼,每个收藏动作都加个视觉反馈(哪怕只是 button.classList.add("saved")),比什么都实在。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










