h5页面在ios手机输入框内emoji表情长度判断
1、需求:
要写一个讨论区的h5页面,当然包含了输入框并且输入框限制字符数 30 个,测试发现在ios手机输入emoji表情后输入框内就会超出所限制的字符长度,(说白了就是只要输入表情就会超出原有的30个字符)
这里呢 我们可以从两个方面去研究,第一:要么直接限制输入表情;第二:想办法计算得出表情的实际字符长度;
记住这里使用.length只对安卓起作用 ,ios手机会让你入坑,接下来我来教你跳出这个坑。直接上代码不啰嗦了;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 自己找个地方去写一个js文件封装以下方法,我这里取名为emoji.js let rsAstralRange = '\\ud800-\\udfff' , rsZWJ = '\\u200d' , rsVarRange = '\\ufe0e\\ufe0f' , rsComboMarksRange = '\\u0300-\\u036f' , reComboHalfMarksRange = '\\ufe20-\\ufe2f' , rsComboSymbolsRange = '\\u20d0-\\u20ff' , rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange; let reHasUnicode = RegExp( '[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']' ); let rsFitz = '\\ud83c[\\udffb-\\udfff]' , rsOptVar = '[' + rsVarRange + ']?' , rsCombo = '[' + rsComboRange + ']' , rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')' , reOptMod = rsModifier + '?' , rsAstral = '[' + rsAstralRange + ']' , rsNonAstral = '[^' + rsAstralRange + ']' , rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}' , rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]' , rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join( '|' ) + ')' + rsOptVar + reOptMod + ')*' , rsSeq = rsOptVar + reOptMod + rsOptJoin, rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?' , rsCombo, rsRegional, rsSurrPair, rsAstral].join( '|' ) + ')' ; let reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g' ); export function toArray (val) { // 字符串转成数组 return hasUnicode(val) ? unicodeToArray(val) : asciiToArray(val); } export function hasUnicode (val) { return reHasUnicode.test(val); } export function unicodeToArray (val) { return val.match(reUnicode) || []; } export function asciiToArray (val) { return val.split( '' ); } 在你的页面引用: import { toArray } from 'components/emoji.js' ; sendInput 这个方法我是在input里面写的输入事件@input=“sendInput” sendInput(e) { if ( this .$cnt.isAndroid) { this .sendOutLength = e.detail.value.length if (e.detail.value.length > 30) { this .sendOutData = e.detail.value.slice(0, 30) } } else { this .sendOutLength = toArray(e.detail.value).length } }, this .$cnt.isAndroid 这个是我用来判断安卓还是ios:安卓的话就用传统的length就行,ios就用上边封装的方法去实现 |
自己亲测没问题的。
努力到无能为力,拼搏到感动自己。
欢迎大家在下方多多评论。
分类:
框架之vue,react
, html+js
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了