记录--被中文输入法坑死了

这篇具有很好参考价值的文章主要介绍了记录--被中文输入法坑死了。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

记录--被中文输入法坑死了

PM:在PC端做一个@功能吧,就是那种...。

记录--被中文输入法坑死了

我:你不用解释🤔我知道那个功能,监听keydown事件,然后e.keycode === 50,那可太简单了。

那可太简单了,可太简单了,太简单了,简单了,单了,了......(掉进坑里的回声)

坑1:KeyBoardEvent.keycode

记录--被中文输入法坑死了

废弃的属性你就坚持用吧,一用一个不吱声。以后线上跑得好好的代码突然报错了,你都不知道bug在哪儿。

现在的web标准里,要确定一个键盘事件是靠e.keye.codecode代表触发事件的物理按键,比如2的位置code='Digit2'key返回用户按下的物理按键的值,它还与 shiftKey 等调节性按键的状态、键盘的区域和布局有关。

所以对于@来说,直接判断e.key === "@"来做后续的操作就行了。

addEventListner('keydown', (e) => {
  if (e.key === "@") {
    e.preventDefalut(); // 这里去掉@字符是为了后续插入和监听方便处理
    // 插入有@字符的,可监听输入的元素
    // 唤起小窗....
  }
});

仔细看上面的这几行代码和注释,要开始考(坑)了。

坑2:输入法的坑

起因

在我美滋滋地以为避过了坑1就没事了的时候,一个夜晚我的测试同学告诉我,在测试环境突然就体验不到这个功能了,无论输入多少个@都不行,白天还好好的🤯。

好一个「白天还好好的」。

我自己测试的时候又百分百能体验到🤔,所以最开始我还在怀疑他没有配上测试系统......

于是,让测试同学的windows电脑连到我的开发环境debug一看:

好家伙,真是好家伙😅他的电脑的e.key === "Process"????!!!

什么意思呢,就是正常我们理想中的@字符产生是shift+2按键的组合,监听keydown之后我们会按顺序收到两个回调:

  1. e.key === "Shift"e.code === "ShiftLeft"或者shiftRight
  2. e.key === "@"e.code === "Digit2"

但是实际在测试同学的电脑里,1是一样的,但是2变了,2变成了e.key === "Process"

虽然键盘事件有变化,但是在前端页面上的@字符是没有任何变化的。难怪他说他会突然失效了。我问他做了什么怎么会突然变了,他想了想说晚上从系统输入法换成了微信输入法.....

上网检索(chatGPT)了一番,明白了一个新的知识点:

输入法的全称叫Input Method Editor输入法编辑器(IME)。本质上它也是个编辑器。为了能输入各类字符(比如汉字和阿拉伯字等),IME会先处理用户的英文字母输入然后通过系统的底层调用传递给浏览器,浏览器再显示到用户的界面。这里的Process很大概率就是当时输入法给出的某个值表示那个时刻它还在处理中。

解决办法

既然KeyBoardEvent靠不住,那我们换一种监听方式。

我找到了一个非常适用于输入法的监听事件叫做CompositionEvent,它表示用户间接输入文本(如使用输入法)时发生的事件。此接口的常用事件有compositionstart, compositionupdatecompositionend。它们三个事件分别对应的动作,通俗一点说就是你用输入法开始打字、正在打字和结束打字。

于是乎,我监听compositionend不就行了!在输入法end的时候我再去看你end的字符是不是@不就行了!

// addEventListner('keydown', (e) => {
addEventListner('compositionend', (e) => {
  // if (e.key === "@") {
  if (e.data === "@") {
    e.preventDefalut(); // 这里去掉@字符是为了后续插入和监听方便处理
    // 插入有@字符并且可监听输入的元素
    // 唤起小窗....
  }
});

对于输入法来说,按键的up和down的key值就算不尽人意也没什么损失,毕竟用户毫无感知。但是,compositionend永远是不会错的,如果compositionende.data都不是@字符了,那么在用户的编辑器界面上的显示肯定也会跟着出错。

所以监听这个肯定就是万无一失的方法了,哈哈哈我真是个“天才”(蠢材)。 修改之后让测试同学尝试之后果然就可以了。

坑3:输入法继续坑

起因

时间过去了没一会,本天才就收到了另一个测试同学反馈的问题说为什么输入了一个@字符之后,会出现两个@在界面上?

我第一反应就是难道没有执行到e.preventDefalut()?既然后续功能能正常使用,没执行到也不应该啊🤔。然后在我电脑一通尝试,发现safari浏览器在输入法为中文的情况下也会触发这个问题。

于是,让测试同学的windows电脑连到我的开发环境debug一看(梅开二度):

执行到了,也没有报错什么的,但是@字符并没有被prevent掉🤯。

再加上我自己传入的@,所以界面上就出现了两个@字符。啊这这这,这很难评......

记录--被中文输入法坑死了

 我是左思右想,百思不得其解,于是只能:

记录--被中文输入法坑死了

stack overflow上也有这个问题。

上面大概的意思就是compositionend事件里使用 e.preventDefault() 在技术上可行的,但它可能不会产生你期望的效果。可能是因为 compositionend 事件标志着一次输入构成(composition)会话的结束,而在这个点上阻止默认行为可能没有意义,因为输入的流程已经完成了。

更推荐用keydown,compositionstartinput来处理这种情况。

keydown是不可能keydown了,已经被坑了。compositionstart也不行,因为刚开始输入那会才按下了shift键,@字符还没出来呢。那就只能input了。

解决办法

最开始我没有选择input就是因为它不能使用e.preventDefault()。我必须要对输入的字符串进行单独处理,去掉@,当时觉得很麻烦就没有选择这个方法。

额....好好好,行行行,现在还是必须得处理一下了。

// addEventListner('keydown', (e) => {
// addEventListner('compositionend', (e) => {
addEventListner('input', (e) => {
  // if (e.key === "@") {
   if (e.data === "@") {
    ?怎么去处理字符呢 // 这里去掉@字符是为了后续插入和监听方便处理
    // 插入有@字符并且可监听输入的元素
    // 唤起小窗....
  }
});

对于这个处理字符的方法,也是一个新知识点了。起初我还想的是去处理编辑器里的content,然后再给它插入回去,这样子复杂度很高并且出错的概率极大。

这里的解决办法主要是使用CharacterData接口。CharacterData 接口是操作那些包含字符数据的节点的核心,特别是在需要动态地更改文本内容时。

例如,在一个文本节点上使用 deleteData() 方法可以从文本中移除一部分内容,而不必完全替换或重写整个节点

const selection = window.getSelection();
const { anchorNode, anchorOffset } = selection;
if (anchorNode.substringData(anchorOffset - 1, 1) === '@') {
  selection.anchorNode.deleteData(anchorOffset - 1, 1);
}

写完这个之后,我用自己的safari浏览器测试发现果然没有问题了。

哈哈哈我真是个“天才”(蠢材)。

坑4:输入法深坑🕳️

我自信满满地让测试同学再重试一下😎,然后测试同学说:和之前一样啊,还是有两个@字符。

我:啊?啊啊??啊啊啊???

记录--被中文输入法坑死了

于是,让测试同学的windows电脑连到我的开发环境debug一看(梅开三度):

发现测试同学电脑上的anchorOffset和正常的情况下是不一样的,会小一位,所以导致anchorOffset - 1拿到的前一个字符并不等于@,所以后续也没有把它处理掉🤯。

我是左思右想,百思不得其解,stack overflow上也没有相关的问题。不过,结合IME的概念,肯定还是输入法的问题。

结合之前keydown的e.key==="Processing",可能在input触发时输入法的编辑器其实还是没有完成工作(composition),导致在那个时候SelectionanchorOffset不一致。其实浏览器的Selection肯定不会错,那anchorOffset看起来像是错了,我觉得应该是输入法在转换的过程对我们的前端页面做了一些用户看不到的东西,而anchorOffset把它显化出来罢了。

解决办法

于是乎,我尝试性的对处理字符串的那串代码进行延时,目的是为了等待输入法彻底工作完毕。

// addEventListner('keydown', (e) => {
// addEventListner('compositionend', (e) => {
addEventListner('input', (e) => {
  // if (e.key === "@") {
   if (e.data === "@") {
     setTimeout(() => {
       const selection = window.getSelection();
       const { anchorNode, anchorOffset } = selection;
       if (anchorNode.substringData(anchorOffset - 1, 1) === '@') {
         selection.anchorNode.deleteData(anchorOffset - 1, 1);
       } // 这里去掉@字符是为了后续插入和监听方便处理
     });
   
    // 插入有@字符并且可监听输入的元素
    // 唤起小窗....
  }
});

然后,问题真的就彻底解决了。

这个功能做起来可太简单了......😅

本文转载于:

https://juejin.cn/post/7307041255740981286

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 记录--被中文输入法坑死了文章来源地址https://www.toymoban.com/news/detail-825080.html

到了这里,关于记录--被中文输入法坑死了的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubuntu设置中文输入法

    2024年02月12日
    浏览(50)
  • linux安装搜狗输入法后无法输入中文

    linux安装sogou输入法参考官网教程,https://shurufa.sogou.com/linux/guide 如下图所示,安装后可以在右上角状态栏看到sogou输入法,但是只能输入英文,无法输入中文。 解决方法如下:

    2024年02月13日
    浏览(71)
  • arch配置中文和输入法

    主要解决三点问题 1.显示中文 2.使用中文输入法 3.显示正确的时间 目录 这篇文章旨在教大家如何配置arch中文和中文输入法和对时间的调整 第一步,就是把arch切换成中文 第二步,就是如何使用中文输入法 时间问题解决 我arch版本是 archlinux2024.3.29 X86-64 桌面环境是 KDE 6.0.3 !注意

    2024年04月08日
    浏览(59)
  • Ubuntu中文设置与安装中文输入法(超详细)

    点击界面右上角的倒三角符号,选择“Settings” 搜索“lagnguage” 点击“Manage Installed Languages”,选择“install” 耐心等待 下载完成后,选择“Install/Remove Languages” 勾选“Chinese(simplified)”并应用 耐心等待 下载完毕后,重新进入设置界面,修改相应设置,点击“Restart”重启

    2024年02月21日
    浏览(55)
  • Kali 安装中文输入法(超详细)

     1.进入管理员下的控制台。 2. 输入密码后点击“授权”。 3.在控制台内输入下面的命令。 4.敲击回车后会开始安装,这里输入“y”。 5.回车后会继续进行安装,安装完成后会自动停止。 6.输入下面的命令来安装google输入法。 7.敲击回车后开始进行安装,这里输入“y”。 8

    2024年02月02日
    浏览(49)
  • Ubuntu22.04-添加中文输入法

    进入setting(设置)- 区域与语言 选项卡 进入“管理已安装的语言” 第一进入将提示“语言支持没有完整安装”,点击安装即可。安装过程会将为进行补充安装的语言进行下载安装。 设置中文,在“语言支持”对话框中点击“添加和删除语言”中选择中文并勾选,“应用”设

    2024年02月11日
    浏览(46)
  • Ubuntu16.04安装中文输入法

    1、使用Ubuntu图像界面配置好中文环境,并将最下面的\\\"系统键盘输入法:\\\"选择为IBus 关于具体的配置看这篇文章https://mp.csdn.net/mp_blog/creation/editor/128273330 最终配置结果如下:   2、上面只是配置中文环境,但不能进行中文输入,需要使用命令安装ibus输入法。 sudo apt-get install ib

    2024年02月13日
    浏览(48)
  • kali设置中文及安装拼音输入法

    输入命令: dpkg-reconfigure locales,这个命令需要root权限,所以可能会用到sudo来提升权限,命令输入完成后按下回车,出现下面的界面,一直按↓,找到en_US.UTF-8 UTF-8,选中这一项,按下空格键,取消该项前面的*,继续按↓ ,找到zh-CN.UTF-8,按下空格键,选上该项前面的星号(按空格

    2024年02月13日
    浏览(42)
  • 【Linux】Ubuntu安装搜狗中文输入法

    配置语言 设置 - 区域与语言 - 管理已安装的语言 - 添加汉语并置顶 - 输入法系统选择fcitx - 应用到整个系统 配置键盘布局 设置 - 键盘 - 输入源 - 只保留英语 安装搜狗输入法依赖 sudo apt -f install sudo apt install libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml sudo apt install libgsettings-qt1 安装搜

    2024年01月23日
    浏览(59)
  • Ubuntu下不能切换中文,qt creator无法输入中文,sogo输入法(详细步骤)

    目录: 1、解决ubuntu 不支持切换中文,并安装sogo输入法步骤; 2、解决Qt Creator不支持中文输入: 详细步骤: 一、解决ubuntu 不支持切换中文,并安装sogo输入法步骤: 1、如果在键盘输入法系统中,没有“fcitx”选项时,建议先打开终端手动安装 fcitx:sudo apt-get install fcitx 2、添

    2023年04月18日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包