需组合codex api与localstorage实现收藏及页面状态同步:初始化时注入收藏按钮并绑定事件;收藏时保存docid、userid、timestamp及滚动位置、折叠状态、光标段落id;跳转时先加载文档再按序还原三类状态,光标恢复需延迟执行。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在Codex中为文档添加收藏功能并确保页面状态(如滚动位置、折叠章节、光标焦点)随收藏同步,需要组合使用其内置API与本地存储机制。
启用收藏按钮并绑定点击事件
在Codex编辑器初始化完成后,向工具栏插入自定义按钮元素,监听其click事件;Codex不提供原生收藏组件,必须手动注入DOM节点并控制行为。
执行 editor.toolbar.addButton({ id: 'toggle-favorite', icon: '★', title: '收藏/取消收藏' }) → 获取返回的button实例 → 调用 button.on('click', handleFavoriteToggle) 绑定处理函数。
保存收藏状态到localStorage
收藏动作本质是记录当前文档ID与用户标识的映射关系。使用 localStorage.setItem('codex-favorites', JSON.stringify(favList)) 存储数组,其中每项含 docId、timestamp 和 userId 字段。
注意:若未在初始化前调用 localStorage.getItem('codex-favorites') 并预加载状态,后续UI图标切换将失效。
这一步操作起来很简单,直接把文件拖进去就行。
同步页面状态到收藏项
每次触发收藏时,必须捕获三项关键状态:当前滚动Y坐标、所有可折叠区块的展开/折叠状态、编辑器光标所在段落ID。缺一不可,否则还原时会出现错位或内容丢失。
第一步:调用 editor.scroller.getScrollTop() 获取垂直滚动偏移量;
通过本地 Codex 或 OpenClaw OAuth 凭证直接调用 ChatGPT/Codex Responses 的 image_generation 工具来生成或编辑光栅图像,然后保存
第二步:遍历 editor.nodes.list 中所有 type === 'collapsible' 的节点,用 node.state.expanded 构建状态映射表;
第三步:执行 editor.selection.getRange() → 提取 range.startContainer.parentElement.closest('[data-id]') 得到焦点段落ID;
将三者合并为 pageState 对象,与文档ID一同存入对应收藏项的 state 字段中。
【必须在handleFavoriteToggle函数内完成这三步,且顺序不能颠倒】
从收藏列表跳转并还原页面状态
方法一:点击收藏项时,先用 editor.open(docId) 加载文档 → 等待 editor.on('ready', restoreState) 触发;
方法二:若文档已打开,直接调用 editor.scroller.scrollToTop(state.scrollTop) → 遍历折叠节点按 state.collapsedMap 逐个设置 node.toggle(state.collapsedMap[node.id]) → 最后用 editor.selection.selectNode(editor.nodes.getById(state.cursorParagraphId)) 恢复光标。
还原失败最常见的原因是 state.cursorParagraphId 对应节点尚未渲染完成,此时需加 setTimeout(() => { /* 执行selectNode */ }, 50) 延迟执行。










