摘要:結(jié)合和簡單的正則就可以實(shí)現(xiàn)一個文本計算函數(shù)其實(shí)當(dāng)字符計算解決后,輸入框限制字符數(shù)就輕而易舉了。思路就是每次事件發(fā)生時,先判斷當(dāng)前字符數(shù)是否超過限制,如果超出,則用上一次的文本替換當(dāng)前輸入框的文本。
一個emoji文本用javascript該如何正確計算其文本長度?
最容易想到的自然是用length來求長度。以下列舉常見emoji和復(fù)雜emoji。
// size: 2 "?".length // size: 7 "????".length
由于JavaScript的字符編碼問題,自然行不通。詳情請參見文章末尾的博文。
基于常見的emoji可以使用以下正則匹配。
// 匹配UTF-16的代理對,把代理對改為一個BMP的字符 function countSymbols(string) { var regexAstralSymbols = /[uD800-uDBFF][uDC00-uDFFF]/g; return string.replace(regexAstralSymbols, "_").length; } countSymbols("?"); // size: 1 countSymbols("????"); // size: 4
但是仍然出現(xiàn)了問題。那么一些更復(fù)雜的emoji表情的時候,還是掛掉了。????這個表情其實(shí)是蘋果中表情農(nóng)民,在Full Emoji List, v5.0里第218個表情。此表情由U+1F468 U+1F3FC U+200D U+1F33E組成。所以直接求長度為 2 + 2 + 1 + 2 = 7。這也在所難免了。
那么該做如何解?
這時候社區(qū)里有twitter的關(guān)于emoji的一個工具庫twemoji,利用這個工具庫,可以方便的實(shí)現(xiàn)emoji文本的實(shí)現(xiàn)。
twemoji.parse("????") // ""
因此可見。twemoji正確的識別了并達(dá)到了我們的預(yù)期。用戶任意輸入一個emoji,我們都只計算為一個長度。利用twemoji解析emoji并返回圖片的特性,結(jié)合正則可以實(shí)現(xiàn)一個函數(shù)。
function countSymbols(string) { return twemoji.parse(string).replace(//g, "_").length; } countSymbols("?"); // size: 1 countSymbols("????"); // size: 1
好的問題解決了。結(jié)合twemoji和簡單的正則就可以實(shí)現(xiàn)一個文本計算函數(shù)
countSymbols("???? and ? parse correctly!"); // size: 24
其實(shí)當(dāng)字符計算解決后,輸入框限制字符數(shù)就輕而易舉了。思路就是每次input事件發(fā)生時,先判斷當(dāng)前字符數(shù)是否超過限制,如果超出,則用上一次的文本替換當(dāng)前輸入框的文本。大致代碼如下。
var prevText = ""; var textarea = document.getElementById("input-area"); var limit = 250; function limitTextSize(){ var text = textarea.value; var size = countSymbols(text); if(size > limit) { textarea.value = prevText; } else { prevText = text; } }
希望能給大家?guī)睃c(diǎn)幫助。求點(diǎn)贊哈哈~
Unicode與JavaScript詳解
Emoji.prototype.length —— Unicode 字符那些事兒
JavaScript 有個 Unicode 的天坑
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90000.html
摘要:也可以通過和屬性來設(shè)置文本域的尺寸,但是屬性設(shè)置不太標(biāo)準(zhǔn),最好的方法是通過設(shè)置。設(shè)置里默認(rèn)大小的文本域?qū)嶋H頁面效果屬性用于設(shè)置文本域可見文本的行數(shù)。此外,屬性也適用于文本域。 1.表單元素 HTML 表單用于收集用戶輸入。 代碼示例: 常用屬性解釋: action屬性定義在提交表單時執(zhí)行的動作通常,表單會被提交到 web 服務(wù)器上的網(wǎng)頁。在上面的例子中,指定了某個服務(wù)...
摘要:但是有時候我們需要實(shí)現(xiàn)文本框中輸入中文長度是或是,其他非中文輸入是。因?yàn)橹形妮斎敕ǖ脑诜钦捷斎霑r,對于我們這個算法,會出現(xiàn)剩余字符數(shù)為負(fù)值的情況。 textarea,input輸入字符數(shù)限制。 在做開發(fā)時,有一種需求是對輸入框(input,textarea)的字?jǐn)?shù)做限制。如果按照J(rèn)S的規(guī)定,字符串里所有的字符,長度都是1。但是有時候我們需要實(shí)現(xiàn)文本框中輸入中文長度是2(或是3),...
摘要:由于我們的富文本輸入框比較簡單,所以只需要處理兩類數(shù)據(jù)即可,其一是普通的文本類型數(shù)據(jù),包括表情其二則是圖片類型數(shù)據(jù)。 最近折騰 Websocket,打算開發(fā)一個聊天室應(yīng)用練練手。在應(yīng)用開發(fā)的過程中發(fā)現(xiàn)可以插入 emoji ,粘貼圖片的富文本輸入框其實(shí)蘊(yùn)含著許多有趣的知識,于是便打算記錄下來和大家分享。 倉庫地址:chat-input-box預(yù)覽地址:https://codepen.io...
摘要:一需求闡述和常用的解決方案制作一個文本框限制最大字?jǐn)?shù),實(shí)時監(jiān)聽當(dāng)前已經(jīng)輸入的字?jǐn)?shù),并顯示出來。因此單純的監(jiān)聽事件顯示是不夠的。如果頁面里需要多個文本框都要限制字?jǐn)?shù)如何實(shí)現(xiàn)。 一、需求闡述和常用的解決方案 制作一個文本框限制最大字?jǐn)?shù),實(shí)時監(jiān)聽當(dāng)前已經(jīng)輸入的字?jǐn)?shù),并顯示出來。期初我實(shí)現(xiàn)這個功能的方法很簡單:給textarea控件添加onkeyup事件方法,在方法中將textarea值的長度...
閱讀 4245·2021-09-26 10:17
閱讀 887·2021-09-22 15:02
閱讀 3485·2021-09-06 15:00
閱讀 1069·2021-07-25 16:52
閱讀 2749·2019-08-29 16:16
閱讀 2527·2019-08-29 13:25
閱讀 1602·2019-08-26 13:51
閱讀 2196·2019-08-26 10:58