摘要:但是有時(shí)候我們需要實(shí)現(xiàn)文本框中輸入中文長度是或是,其他非中文輸入是。因?yàn)橹形妮斎敕ǖ脑诜钦捷斎霑r(shí),對(duì)于我們這個(gè)算法,會(huì)出現(xiàn)剩余字符數(shù)為負(fù)值的情況。
textarea,input輸入字符數(shù)限制。
在做開發(fā)時(shí),有一種需求是對(duì)輸入框(input,textarea)的字?jǐn)?shù)做限制。如果按照J(rèn)S的規(guī)定,字符串里所有的字符,長度都是1。但是有時(shí)候我們需要實(shí)現(xiàn)文本框中輸入中文長度是2(或是3),其他非中文輸入是1。這個(gè)時(shí)候就需要自己寫一段代碼來判斷:
function getStringLengthForChinese (val) { let str = val.toString() let bytesCount = 0 for (let i = 0, len = str.length; i < len; i++) { let c = str.charCodeAt(i) if ((c > 0x0001 && c <= 0x007e) || (c >= 0xff60 && c <= 0xff9f)) { //這里是16進(jìn)制表示,也可以用十進(jìn)制 bytesCount = bytesCount + 1 } else { bytesCount = bytesCount + 2 } } return bytesCount }
這樣就實(shí)現(xiàn)了獲取一段字符串的長度,中文為2。
接下來就是對(duì)輸入的字符串長度進(jìn)行限制:
在input和textarea中,輸入的長度限制需要添加maxlength屬性。通常情況下,只要給maxlength一個(gè)固定的值就能解決問題。但是這里由于我們的中文預(yù)設(shè)長度是2。所以maxlegth的值應(yīng)該是動(dòng)態(tài)設(shè)置的。
我用vue來寫,只要在模板中給maxlength綁定一個(gè)值:
還可以輸入{{codeNum}}個(gè)字符
maxlegth需要給定一個(gè)預(yù)設(shè)值。
下面是限制字符輸入數(shù)量的方法:
function computedLen(str, totalLength, maxLength) { let rep = /[0-9a-zA-Z|s]/ // 正則判斷字母數(shù)字 let strArr = str.split("") let totalLen = totalLength// 總的輸入長度 let maxLen = maxLength// input或textarea上maxlength的值,這里由于中文算2個(gè)占位,所以傳入的maxLength應(yīng)該為totalLength的一半 let len = 0 // 已經(jīng)輸入的字符數(shù) let leftLen = 0 // 剩余可輸入字符數(shù) strArr.forEach((val,key) => { if (rep.test(val)) { leftLen = Math.ceil(totalLen - len * 2)// 剩余輸入數(shù)等于總長 - 輸入數(shù),乘以2是因?yàn)榉侵形牡膌en只算0.5 if (leftLen === 0) { return false // 如果剩余數(shù)是0,就退出循環(huán),不能輸入了 } len = len + 0.5// 如果輸入非中文,算加半個(gè)字符,maxlengtrh也加0.5,這樣就實(shí)現(xiàn)了兩個(gè)非中文長度等于一個(gè)中文 maxLen = maxLen + 0.5 } else { len = len + 1 } }) return { maxLen: Math.ceil(maxLen) // 返回我們需要的maxlegt的值 } } function textareaChange (e) { setTimeout(() => { let count = this.computedLen(e.target.value, 30, 15) this.maxLength = count.maxLen }, 200) }
上面代碼的關(guān)鍵在于獲取maxlength的值。這個(gè)值是動(dòng)態(tài)的,在只輸入中文的情況下,這個(gè)值等于我們的預(yù)設(shè)值,如果輸入兩個(gè)非中文,maxlength就會(huì)動(dòng)態(tài)的加1。
vue watch監(jiān)聽剩余字?jǐn)?shù),并截?cái)喽喑龅淖址?。因?yàn)橹形妮斎敕ǖ脑?strong>非正式輸入時(shí),對(duì)于我們這個(gè)算法,會(huì)出現(xiàn)剩余字符數(shù)為負(fù)值的情況。所以需要增加以下代碼,在輸入數(shù)量超過時(shí)截?cái)唷?/p>
watch: { "title" () { this.codeNum = 30 - this.getStringLengthForChinese(this.title) if (getStringLengthForChinese(this.title) > 30) {//如果占位數(shù)大于30 let arr = this.title.split("")// 輸入字符串轉(zhuǎn)為數(shù)組,依次推出最后一位元素 for (let i = arr.length - 1; i >= 0; i--) { arr = arr.slice(0, i)// 每推出一個(gè),將數(shù)組轉(zhuǎn)為字符串,做一次占位數(shù)判斷 this.title = arr.join("") if (getStringLengthForChinese(this.title) <= 30) { break } } } } }
最終效果:
完整demo(vue寫的):
Document 還能輸入{{codeNum}}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96683.html
摘要:結(jié)合和簡單的正則就可以實(shí)現(xiàn)一個(gè)文本計(jì)算函數(shù)其實(shí)當(dāng)字符計(jì)算解決后,輸入框限制字符數(shù)就輕而易舉了。思路就是每次事件發(fā)生時(shí),先判斷當(dāng)前字符數(shù)是否超過限制,如果超出,則用上一次的文本替換當(dāng)前輸入框的文本。 一個(gè)emoji文本用javascript該如何正確計(jì)算其文本長度?最容易想到的自然是用length來求長度。以下列舉常見emoji和復(fù)雜emoji。 // size: 2 ?.length ...
摘要:表單如果表單內(nèi)沒有按鈕,只有元素,那么這個(gè)可以升級(jí)為按鈕。輸入框選中高亮,輸入非數(shù)字,改變顏色可設(shè)置,不能設(shè)置而則可以,但不能設(shè)置最大字符數(shù)。 form 表單 如果form表單內(nèi)沒有submit按鈕,只有button元素,那么這個(gè)button可以升級(jí)為submit按鈕。 form 表單用來向服務(wù)器提交信息,常用屬性 action:提交表單的地址 name:頁面中可能不止一個(gè)表單,...
摘要:屬性可以設(shè)置文本框的初始值。特性則是用于指定文本框內(nèi)可以接受的最大字符數(shù)。與這個(gè)方法對(duì)應(yīng)的事件,在選擇了文本框中的文本時(shí)事件觸發(fā)。如阻止用戶選擇要調(diào)用之前或之后立即將焦點(diǎn)設(shè)置到文本框。 在HTML中,有兩種方式來表現(xiàn)文本框: 一種是使用input元素的單行文本,另一種是使用textarea的多行文本框。 使用input方式,必須添加type,設(shè)置為text。 size特性,可以指定文...
摘要:多個(gè)標(biāo)簽原生表單部件通用屬性默認(rèn)這個(gè)布爾屬性允許您指定當(dāng)頁面加載時(shí)元素應(yīng)該自動(dòng)具有輸入焦點(diǎn),除非用戶覆蓋它,例如通過鍵入不同的控件。元素的名稱這是用于表單數(shù)據(jù)提交的。到目前為止,表單是最常見的攻擊媒介可能發(fā)生攻擊的地方。 表單介紹 HTML表單是用戶和web站點(diǎn)或應(yīng)用程序之間交互的主要內(nèi)容之一。它們?cè)试S用戶將數(shù)據(jù)發(fā)送到web站點(diǎn)。大多數(shù)情況下,數(shù)據(jù)被發(fā)送到web服務(wù)器,但是web頁面也...
閱讀 2582·2021-11-22 13:53
閱讀 4094·2021-09-28 09:47
閱讀 878·2021-09-22 15:33
閱讀 825·2020-12-03 17:17
閱讀 3324·2019-08-30 13:13
閱讀 2130·2019-08-29 16:09
閱讀 1184·2019-08-29 12:24
閱讀 2457·2019-08-28 18:14