经验总结:应对中文输入法的字符串截断方案(带代码示例)

简介:

遇到这么个需求,允许用户修改自己的名片,名片最大长度支持8个汉字(24个字节),当用户输入超过8个字节,则不允许用户继续输入

最初的思路:oninput你好

很常见的需求,觉得驾轻就熟,监听input事件,当输入内容发生变化的时候,获得用户输入内容,并进行截断操作(如果超出的话)。主要代码如下。一切显得那么美好,直到中文输入法出现。

ps:本文用例均在 chrome 版本 33.0.1750.146下测试

$('#text').on('input', function() {
    var value = $(this).val();
    if(Str.byteLen(value, 3)>24){
        $(this).val(Str.getMaxlen(value, 24));
    }
});

完整代码如下,有兴趣可以看下:

  完整代码

oninput的局限:中文输入法带来的难题

上面的解决方案对于普通的文本输入,如英文字母、数字等的输入是ok的。但当用户通过中文输入法(比如QQ拼音)时,就会遇到一些问题,我们简单改下上面的代码,看看究竟会有什么问题。就加多了个log打印。

复制代码
    $('#text').on('input', function() {
        var value = $(this).val();
        console.log('当前输入:'+value);  // 打印当前输入的值
        if(Str.byteLen(value, 3)>24){
            $(this).val(Str.getMaxlen(value, 24));
        }
    });
复制代码

 

下面是输入过程中的截图。可以看到,用户使用中文输入法输入的过程中,“input”事件被不断地触发着,这会带来什么问题呢?相信你已经想到了——会导致程序对当前用户输入字符实际长度的误判。比如用户输入“程序猿”三个汉子,实际占用9个字节,但对上面的程序来说,取到的字节数为"chengxuyuan".length == 11。在用户输入达到边界值时,就会莫名其妙地将用户的输入截断,导致中文输入无法接续(感兴趣的同学可以自己试下)

 

解决思路一:compositionstart、compositionend

在万能的幼稚园群里抛出问题后,有个兄弟提出了个方案:可以采用compositionstart、compositionend来捕获IME(input method editor)的启动和关闭事件。说实话,这两事件听都没听过,但既然有这么个解决方案,暂且试一下,再次修改代码

复制代码
$('#text').on('input', function() {
    if($(this).prop('comStart')) return;    // 中文输入过程中不截断

    var value = $(this).val();
    console.log('当前输入:'+value);
    if(Str.byteLen(value, 3)>24){
        $(this).val(Str.getMaxlen(value, 24));
    }
}).on('compositionstart', function(){
    $(this).prop('comStart', true);
    console.log('中文输入:开始');
}).on('compositionend', function(){
    $(this).prop('comStart', false);
    console.log('中文输入:结束');
});
复制代码

 

输入过程截图如下,可以看到,当compositionstart事件触发,就停止对输入字符的截断操作,而是耐心等待用户输入的结束

按下空格键,中文输入结束,此时再去进行字符长度的判读和截断

 

未完的探索

正如正文最前面强调的,本文的用例都是在chrome特定版本下进行测试,显然compositionstart、compositionend并不是一个兼容所有浏览器的方案。包括jQuery的“input”事件都是内部做了一堆兼容性处理的。假如这个需求是要兼容所有主流浏览器的话就真跪了,虽然这个迟早有一天会变成残酷的现实。

所以呢,探索还将继续:是否有兼容所有主流浏览器的方案,求路过的兄弟们支招。

 

相关文章
|
2月前
|
小程序 API 开发工具
mPaaS小程序问题之空白如何解决
mPaaS小程序是阿里巴巴移动平台服务(mPaaS)推出的一种轻量级应用解决方案,旨在帮助开发者快速构建跨平台的小程序应用;本合集将聚焦mPaaS小程序的开发流程、技术架构和最佳实践,以及如何解决开发中遇到的问题,从而助力开发者高效打造和维护小程序应用。
37 0
|
9月前
|
前端开发 JavaScript PHP
php使用mPDF实战案例分析字符串太长时文本变小无法自动分页的解决方案
php使用mPDF实战案例分析字符串太长时文本变小无法自动分页的解决方案
127 0
|
12月前
|
存储 算法
很全的敏感词匹配系统的设计与实践(2)
很全的敏感词匹配系统的设计与实践(2)
|
12月前
|
消息中间件 人工智能 算法
很全的敏感词匹配系统的设计与实践(1)
很全的敏感词匹配系统的设计与实践(1)
|
数据库
【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记
您好,我是码农飞哥,一直想飞暂时在跑个那个老哥。
207 0
【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记
|
开发工具 git
手写短命令工具 - 解决工作中的痛点
写这个工具是为了解决自己日常工作中的一些重复性的劳动,提高一些效率。也算是通过程序来解决工作中的一些痛点。 有些命令如果我们能每次节省2秒钟甚至更多的时间,短期看不到时间的节省,但是从长期来看这个价值将是巨大的。我可以将这些时间专注于更有意义,更重要的事情 - 提高生命质量。
71 0
|
开发框架 小程序 JavaScript
挑战新形式,小程序之手势解锁登录功能教程【附完整代码及思路】
挑战新形式,小程序之手势解锁登录功能教程【附完整代码及思路】
232 0
挑战新形式,小程序之手势解锁登录功能教程【附完整代码及思路】
|
设计模式 Java 程序员
细微之处见真章之字符串超长省略功能
细微之处见真章之字符串超长省略功能
183 0
|
算法 搜索推荐 大数据
完善算法技术 规范算法应用(文章结尾有彩蛋)
完善算法技术,规范算法应用,才能让科技更人性化地服务社会,让数字文化生活更多彩、更美好!
195 0
完善算法技术 规范算法应用(文章结尾有彩蛋)