Repository navigation
[Bug] 安卓语音输入:输入法组字里带换行时,输入框只落地一部分文本(首段整段丢失) #6552
Replies: 1 comment
你的埋点已经把根因指出来了:首段是在输入法/WebView 那一层就没送出来先说你这份 trace 里最关键、但可能被忽略的一处: 结论:首段从来没有进入编辑器的 DOM。 为什么可以排除"是 DSH 的文本管线丢的"我在 (该注释原文: 也就是说 DSH 不拦截、不重写、不自行插入组字文本——组字期间的 DOM 由浏览器原生写入。DSH 这边唯一的 IME 相关代码是按键守卫,在
那管的是 Enter/Space 误提交,与文本落地无关。(输入框本身是 Lexical 0.49 + 机制(和你推测的一致,但可以说得更准)一次组字里带换行时,组字区跨了 block 边界。你 trace 里 触发它的是「AI 整理」这个会反复重声明组字文本(105 → 58 → 41)的输入法功能;普通的逐字组字不会一次塞进换行。 可以立刻用的规避
想真修的话,方向在这里要治的不是"取消区"逻辑,而是别在组字进行中重建块 DOM:即让换行导致的段落拆分推迟到 说明一句:我这边无法起 Android WebView 复现,所以"WebView 作废组字区"这一步是基于你自己的埋点序列(DOM 已截断 + 另外你另开的 #6550 是同一条(同标题同内容),修的时候按一条跟即可。 |
Uh oh!
There was an error while loading. Please reload this page.
环境
现象
用语音说一段话,等输入法「AI 整理」完成后,输入框里的文本会比整理版少一整段:
说明:输入法把口述重写、压缩是它自己的功能,不算 bug。这里只针对整理后的文本没有完整落地。
复现步骤
关键证据(客户端埋点:composition / beforeinput / input + DOM 变更)
一次典型现场(
t是页面内相对毫秒):同一次口述里,输入法先后声明的组字文本是:
d=105(未整理原文)→d=58(整理版,两行)→d=41(只剩第二行)。输入法声明的组字文本里有换行,而落进编辑器的只剩换行之后那一段。
对照组:
定位
insertCompositionText组字区跨段落的边界处理,与编辑器的 DOM 重建叠加导致的;期望行为
compositionend之后,这一段的实际文本不应该少于输入法在compositionupdate/compositionend里声明的文本。建议的修复方向
compositionend后做一次完整性校验:拿输入法声明过的文本与该段实际文本比对;如果声明文本更长、且实际文本是它的连续子串,就按声明文本用受控插入补全(不要重新进入组字);beforeinput(insertCompositionText)检测到data含\n时,别让组字区跨段落推进(例如先把整段落进单个 block,再由编辑器自行拆段);附:我这边做的临时缓解(没有改宿主代码)
在客户端注入一段只读监听 + 静默修补脚本:组字期间记录输入法声明过的每一版文本;
compositionend之后如果框里该段文本是其中某一版的连续子串、而且更短,就按那一版补全(只补不删,措辞变化一律尊重输入法的整理结果)。这能消除现象,但它属于事后修补,根治还是要在编辑器层做。All reactions