码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 从零开始,开发一个 Web Office 套件(11):支持中文输入法(or 其它使用输入法的语言)


    这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的、类似于微软 Office 的 Web Office 套件(包括:文档、表格、幻灯片……等等)。
    博客园:《从零开始, 开发一个 Web Office 套件》系列博客目录
    富文本编辑器 Github repo 地址:https://github.com/zhaokang555/canvas-text-editor
    富文本编辑器 在线 Demo:https://zhaokang555.github.io/canvas-text-editor/

    2. 富文本编辑器(MVP)

    2.23 Feature:通过中文输入法,输入中文

    2.23.1 基本原理

    输入中文(或者其它需要输入法的语言),跟输入英文的不同之处在于:我们通过键盘输入的文字,并不是直接显示在input框里。而是要通过输入法进行映射、选择,再填入input框里。

    这里就牵扯到三个事件,我们可以看下MDN文档:

    • compositionstart:https://developer.mozilla.org/zh-CN/docs/Web/API/Element/compositionstart_event
    • compositionupdate: https://developer.mozilla.org/zh-CN/docs/Web/API/Element/compositionupdate_event
    • compositionend: https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionend_event

    上面的文档里还有demo可以玩儿,通过它可以更好地帮助我们理解这三个事件代表的含义:

    同时,我们还需要了解下InputEvent的以下两个属性:

    • InputEvent.isComposing: https://developer.mozilla.org/zh-CN/docs/Web/API/InputEvent/isComposing
    • InputEvent.inputType: https://developer.mozilla.org/zh-CN/docs/Web/API/InputEvent/inputType

    为了更形象地理解这两个属性,我做了一个小demo。对比了输入英文和中文时,这些属性的区别:

    2.23.2 算法

    1. 在我们输入中文过程中,需要在编辑器中插入一些特殊的临时字符。我们称之为TempCompositionChar
    2. 每当我们按一次键盘:
      1. 清空上一次插入的所有TempCompositionChar
      2. 将光标相对字符的位置(cursorIdxInChars,cursorIdxInCurPara)回退
      3. 插入新的CompositionChars
    3. 当我们的输入法完成一次输入,将文字填充入input框里时(即:触发compositionend事件时):将TempCompositionChar固定下来,改为CompositionChar

    2.23.3 实现

    新建CompositionChar类:

    在Store中添加如下方法:

    • 插入单个字符
    • 批量插入字符
    • 清空所有临时字符
    • 固定所有临时字符,将其转化为CompositionChar

    其中,char.moveCursorToMyRight是我们重构之后,从click回调中抽象出来的函数:

    在input事件回调中,判断输入的是英文还是中文,然后调用相关逻辑:

    2.23.4 效果

    (未完待续)

  • 相关阅读:
    5. 【非递归版】先序、中序、后序遍历 + 求数的深度(用层序遍历实现)
    【数据结构】LRU缓存
    LeetCode 63. 不同路径 II
    python中__init__subclass__方法用法详解
    【AI应用】海康威视iVMS-4200软件安装
    GNSS模块如何应用在“监控案例”中
    计数排序的简单理解
    罗永浩讽刺iPhone“那么伟大又那么不要脸”;北欧囚犯正在训练AI大模型;ChatGPT治怪病丨RTE开发者日报 Vol.51
    巧用 transition 实现短视频 APP 点赞动画
    《Django 3 Web应用开发从零开始学(视频教学版)》简介
  • 原文地址:https://www.cnblogs.com/forzhaokang/p/16007246.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号