Skip to content

macOS 中文输入法 IME composition 状态下,Enter 会误触发消息发送 #23

Open

Description

@JunQiao666

问题描述

我在使用 hosted wanman.ai 的聊天界面时,发现 macOS 中文输入法在 IME composition 状态下按 Enter,会误触发消息发送。

具体来说,当我使用 macOS 自带中文输入法输入中英混合内容时,例如:

我在setting

如果此时输入法候选窗口仍然处于激活状态,按 Enter 本来应该只是确认当前的 IME candidate / composition text。但在 wanman 的 chat composer / message input 中,Enter 会同时触发消息发送,导致消息被提前发送。

在部分情况下,消息发送后,刚刚确认的 composition text 还会残留在输入框中。例如消息已经发送了 我在setting,但输入框里又出现了 setting。

复现环境

  • 产品:hosted wanman.ai

  • 操作系统:macOS 26.3.1 (25D2128)

  • 浏览器:Chrome Version 149.0.7827.104 (Official Build) (arm64)

  • 输入法:

    • macOS 自带中文双拼输入法:可复现
    • macOS 自带中文拼音输入法:可复现
  • 出现位置:chat composer / message input

复现步骤

  1. 打开 wanman.ai 的聊天界面。
  2. 使用 Chrome 浏览器。
  3. 切换到 macOS 自带中文输入法,双拼或拼音均可。
  4. 在 chat composer 中输入中英混合内容,例如:我在setting。
  5. 保持输入法候选窗口仍然处于激活状态。此时 macOS 中文输入法的候选窗口仍然显示在输入框下方,说明当前输入还处于 IME composition 状态。
  6. 按 Enter,尝试确认当前 IME candidate / composition text。
  7. 观察到消息被直接发送。
  8. 同时,刚刚确认的 composition text 可能会残留在输入框中,例如 setting。

期望行为

当 IME composition 仍然处于 active 状态时,Enter 应该只用于确认输入法候选内容,不应该触发消息发送。

也就是说:

  • 第一次 Enter:确认 IME candidate / composition text
  • composition 结束后,再次按 Enter:才发送消息

或者用户通过明确的发送操作,例如点击发送按钮,再发送消息。

实际行为

在 IME composition 尚未结束时,按 Enter 会直接发送消息。

同时,刚刚确认的 composition text 可能会残留在 chat composer 中。例如消息已经发送了 我在setting,但输入框里又出现了 setting。

截图

我附上了两张截图:

  1. 输入 我在setting 时,macOS 中文输入法候选窗口仍然处于激活状态。
  2. 按 Enter 后,消息被发送,同时输入框中残留了 setting。

可能原因

我不确定 wanman 当前 chat composer 的具体实现,但从现象上看,可能与 Enter submit 逻辑没有正确判断 IME composition 状态有关。

可能需要在处理 Enter 发送消息时检查:

  • KeyboardEvent.isComposing
  • compositionstart
  • compositionend
  • 如果使用 React,也可能需要检查 event.nativeEvent.isComposing

当 IME composition 处于 active 状态时,应避免将 Enter 作为 submit message 的快捷键处理。

影响

这个问题会影响使用中文、日文、韩文等 IME 输入法的用户,尤其是在中英混合输入时比较明显。

对于中文用户来说,在中文输入法下直接输入英文单词是很常见的操作习惯,因此这个问题会影响聊天输入体验。

补充说明

我目前确认该问题在 Chrome 中可以复现,并且在 macOS 自带中文双拼输入法和中文拼音输入法下都可以复现。

我暂时还没有测试 Safari、Firefox、Edge 或其他第三方输入法。

Image Image

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions