Files
new-markdown/docs/26-编辑区右键菜单.md

42 lines
2.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# docs/26 编辑区自绘右键菜单 + WebView 自带菜单屏蔽(补账)
## 先说清一笔旧账
docs/21 §1 写了「App 全局监听 contextmenu 并 preventDefault、编辑区
右键已被屏蔽」,但核查提交 2d1cd30 的实际代码后确认:**那段监听从未
落进代码**,只有文档与提交说明写了。结果就是编辑区右键一直是 WebView
自带菜单——用户再次报回。docs/21 已加勘误。本次把屏蔽与自绘菜单一并
真正实现,并用无头浏览器的真实右键逐项验证(见下)。
## 实现
1. **全局屏蔽**(App 挂载 effect):document 监听 contextmenu 并
preventDefault;`input / textarea` 豁免(输入框保留系统菜单的拼写
检查与粘贴)。React 的各自定义菜单(标签/文件树/编辑区)在冒泡链
上先于 document 监听打开,不受影响。
2. **编辑区自绘菜单**(新组件 EditorContextMenu):在 .editor-area 上
按事件落点分发——富文本落在 .ProseMirror、源码落在 .source-cm 才
弹出。条目与顶部「编辑/格式」菜单同一套实现:
- 剪切 / 复制(无选区禁用,选区状态在打开瞬间从编辑器状态读取,
源码模式经 SourceEditorApi 新增的 hasSelection);
- 粘贴(走既有 pasteFromClipboard:富文本经剪贴板读文本插入,
源码聚焦后原生粘贴);全选;
- 富文本独有:加粗 / 斜体 / 删除线 / 行内代码 / 超链接…;
- 末项模式切换(源码模式 ↔ 即时渲染)。
菜单容器 mousedown 阻止默认行为,焦点与选区留在编辑器里,
execCommand 类命令作用准确;位置按窗口尺寸夹取不溢出。
## 验证
- 无头浏览器真实右键:菜单弹出且条目齐全;无选区时剪切/复制禁用、
全选后可用;点「加粗」选中文本真的变粗;标题栏右键无自绘菜单
(自带菜单已被屏蔽);合成事件核查:编辑区 contextmenu 被
preventDefault、输入框放行。
- 组件测试 2 例(tests/editor-context-menu.test.tsx);vitest 108+2;
tsc 0 错误;构建通过。
## 待真机复验
- WebView2 里右键不再出现自带菜单(拼写检查/检查元素等);
- 粘贴在桌面端的剪贴板权限表现(与顶部「编辑 → 粘贴」同一路径)。