回车发送功能(区分输入法回车和普通回车以及shift+回车换行功能)

需求

用户在输入框内输入完成后,点击回车键或者发送按钮发送信息,通过shift+回车键换行。

难点

如果简单的以code === 'Enter'作为发送事件的条件,在中文输入拼音阶段,直接点击回车仍会触发发送事件。

思路

  1. 监听输入框的键盘事件
  2. 判断按键为回车键
    1. 当不是中文输入回车且没有同时按 'shift'键时,触发发送事件

一、区分输入法回车

我们首先要了解一下键盘事件,键盘事件有哪些?

keydown/keyup

当我们按下'enter'键事件返回以下内容

当我们在中文输入过程中(输入拼音但未选择的时候)按下'enter'键

此时我们应该发现了这个关键的key,process 代表'The Process key. Instructs the IME to process the conversion.'(过程密钥。指示输入法处理转换。),由此我们可以通过key === 'Process'来区分普通'enter'和输入法时'enter'。

二、如何确定 shift + 回车

到现在我们已经可以区分普通回车和输入法回车,哪如何shift+回车换行呢?

仍然是回车时间返回的参数,当我同时按下shift+回车,返回以下内容,会返回两个键的信息,一个是shift键,一个是enter键的信息,我们看enter键的信息也就是第二个,注意shiftKey,它表示事件触发时 shift 键是 (true) 否 (false) 按下。

由此我们可以知道通过shiftKey可以判断回车时是否同时按shift键。

注意:

到现在我们已经可以实现需求了,但是还有一个坑,键盘事件需要选择keydown而不是keyup,keyup事件内去阻止浏览器默认事件是不行的,也就是说 enter 依旧换行。

代码示例为vue + element示例,其他框架思想一样暂且不表。

xml 复制代码
<template>
  <div>
      <el-input
        v-model="content"
        @keydown="contentKeyDown"></el-input>
  </div>
<template>

<script setup>
  import { ref } from "vue";
  const content = ref('')
  // 按键事件,enter输入
  const contentKeyDown = (e) => {
  	const { code, key, shiftKey } = e
    if (code === 'Enter') {
      // key === Process 输入法按键
      if (key !== 'Process' && !shiftKey) { // shift + enter 换行
        e.preventDefault() // 阻止浏览器默认时间,不换行
        sendMsg(content.value) // 发送事件
      }
    }
	}
  // 发送事件
  const sendMsg = () => {
    // ...
  }
</script>

完结。

参考:

MND-KeyboardEvent

MDN-keyvalues

相关推荐
u01110267511 小时前
图片处理接口如何统一错误信息 前端提示与后端错误码设计
前端·状态模式
福兮说11 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
libokaifa11 小时前
把语音模型塞进手机:sherpa-onnx 在 Android 上的 ASR / TTS
前端
deli00712 小时前
DLA 枝晶生长实测:5000 个粒子集体停摆之后,分形维数收敛到 1.70
前端
IT_陈寒12 小时前
Redis卡顿的锅,这次真不是大key的错
前端·人工智能·后端
可乐鸡翅yeah_12 小时前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
程序猿追13 小时前
HarmonyOS 6 上做个极简浏览器:Web 组件 + 前进后退 + 加载进度
前端·华为·harmonyos
沐沐师13 小时前
Mybatis 框架教程
前端
三天不学习13 小时前
Tailwind CSS 快速入门(2026 版):从 v4 零配置上手,到「该不该用、怎么用好」的选型实战
前端·css·tailwind
明月_清风13 小时前
面对陌生的 GitHub 项目无从下手?这 4 个网站帮你快速读懂源码
前端·后端·github