詳解input組合事件如何監(jiān)聽(tīng)輸入中文
input 組合事件
compositionEvent 組合事件是拆分了不同步驟的事件的組合,是由 compositionStart,compositionUpdate 和 compositionEnd三個(gè)事件組合而成。
Start 和 End 事件只執(zhí)行一次,Update 會(huì)執(zhí)行多次。
輸入前,會(huì)觸發(fā) Start 和 Update 事件;沒(méi)有選中中文之前,會(huì)一直觸發(fā) Update 事件;選中文字后,會(huì)觸發(fā) End 事件;一個(gè)組合事件完成,以此循環(huán)。
compositionstart
輸入法編輯器開(kāi)始新的輸入合成時(shí)會(huì)觸發(fā) compositionstart事件。
例如:當(dāng)用戶使用拼音輸入法開(kāi)始輸入漢字時(shí),這個(gè)事件就會(huì)被觸發(fā)。
compositionupdate
字符被輸入到一段文字的時(shí)候(這些可見(jiàn)字符的輸入可能需要一連串的鍵盤(pán)操作、語(yǔ)音識(shí)別或者點(diǎn)擊輸入法的備選詞)會(huì)觸發(fā) compositionupdate 事件。
compositionend
當(dāng)文本段落的組成完成或取消時(shí), compositionend 事件將被觸發(fā)。
注意:清除鍵、粘貼、英文字母和數(shù)字是不會(huì)觸發(fā)這幾個(gè)事件的。Start 和 Update 事件會(huì)在 onChange 之前觸發(fā),End 事件在onChange之后觸發(fā)。
例子
簡(jiǎn)單使用
<input
placeholder="Basic usage"
onChange={e => console.log('onchange', e.target.value)}
onCompositionStart={e => console.log('onCompositionStart', e.target.value)}
onCompositionUpdate={e => console.log('onCompositionUpdate', e.target.value)}
onCompositionEnd={e => console.log('onCompositionEnd', e.target.value)}
/>輸入英文'suzhou', 只會(huì)觸發(fā)onChange事件:

輸入中文‘蘇州’,觸發(fā)事件如下:

輸入中文‘蘇州’后, 刪除‘州’,只會(huì)觸發(fā)onChange事件:

直接使用 onCompositionEnd事件,只能監(jiān)聽(tīng)到輸入改變,不能監(jiān)聽(tīng)到刪除。
監(jiān)聽(tīng)輸入的中文字符變化,如何實(shí)現(xiàn)?
let isOnComposition = false
function handleComposition(e) {
console.log(e.type, e.target.value)
if (e.type === 'compositionend') {
isOnComposition = false
if (!isOnComposition) {
onChange(e);
}
} else {
isOnComposition = true
}
}
function onChange(e) {
if (!isOnComposition) {
console.log('onChange', e.target.value)
}
}
ReactDOM.render(
<input
placeholder="Basic usage"
onChange={onChange}
onCompositionStart={handleComposition}
onCompositionUpdate={handleComposition}
onCompositionEnd={handleComposition}
/>, mountNode);輸入英文‘suzhou’,只會(huì)觸發(fā) onchange 事件:

輸入中文‘蘇州’,然后刪除‘州’,觸發(fā)事件如下:

組合事件與 'onchange' 結(jié)合使用,就實(shí)現(xiàn)了監(jiān)聽(tīng)中文字符輸入變化。
input 在手機(jī)端觸發(fā)軟鍵盤(pán)的表現(xiàn)
輸入框聚焦(觸發(fā) focus 事件)后,會(huì)彈出軟鍵盤(pán), 表現(xiàn)如下:
IOS 軟鍵盤(pán)彈起表現(xiàn)
輸入框獲取焦點(diǎn)后,鍵盤(pán)彈起,頁(yè)面(webview)沒(méi)有被壓縮,頁(yè)面可使區(qū)域高度(height)還是原高度,只是頁(yè)面(webview)整體往上滾了,且最大滾動(dòng)高度(scrollTop)為軟鍵盤(pán)高度。
Android 軟鍵盤(pán)彈起表現(xiàn)
輸入框獲取焦點(diǎn)后,鍵盤(pán)彈起,頁(yè)面(webview)高度會(huì)發(fā)生改變,高度為可視區(qū)高度(原高度減去軟鍵盤(pán)高度),除了因?yàn)轫?yè)面內(nèi)容被撐開(kāi)可以產(chǎn)生滾動(dòng),webview 本身不能滾動(dòng)。
IOS 軟鍵盤(pán)收起表現(xiàn)
觸發(fā)軟鍵盤(pán)上的“收起”按鈕鍵盤(pán)或者輸入框以外的頁(yè)面區(qū)域時(shí),輸入框失去焦點(diǎn),軟鍵盤(pán)收起,會(huì)觸發(fā) blur事件。
Android 軟鍵盤(pán)收起表現(xiàn)
觸發(fā)輸入框以外的區(qū)域時(shí),輸入框失去焦點(diǎn),軟鍵盤(pán)收起。但是,觸發(fā)鍵盤(pán)上的收起按鈕鍵盤(pán)時(shí),軟鍵盤(pán)收起,輸入框不會(huì)失去焦點(diǎn),不會(huì)觸發(fā) blur事件。
綜合上面鍵盤(pán)彈起和收起在 IOS 和 Android 上的不同表現(xiàn),需要分開(kāi)處理來(lái)監(jiān)聽(tīng)軟鍵盤(pán)的彈起和收起:
- 在
IOS上,監(jiān)聽(tīng)輸入框的focus事件來(lái)獲知軟鍵盤(pán)彈起,監(jiān)聽(tīng)輸入框的blur事件獲知軟鍵盤(pán)收起。 - 在
Android上,監(jiān)聽(tīng)webview高度會(huì)變化,高度變小獲知軟鍵盤(pán)彈起,否則軟鍵盤(pán)收起。
以上就是詳解input組合事件如何監(jiān)聽(tīng)輸入中文的詳細(xì)內(nèi)容,更多關(guān)于input組合事件監(jiān)聽(tīng)輸入中文的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue.js計(jì)算屬性computed用法實(shí)例分析
這篇文章主要介紹了vue.js計(jì)算屬性computed用法,結(jié)合實(shí)例形式分析了vue.js使用computed方式進(jìn)行屬性計(jì)算的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
vue+mousemove實(shí)現(xiàn)鼠標(biāo)拖動(dòng)功能(拖動(dòng)過(guò)快失效問(wèn)題解決方法)
這篇文章主要介紹了vue+mousemove實(shí)現(xiàn)鼠標(biāo)拖動(dòng)功能,文中給大家介紹了鼠標(biāo)移動(dòng)過(guò)快拖動(dòng)就失效問(wèn)題的解決方法,需要的朋友可以參考下2018-08-08
vue封裝自定義指令之動(dòng)態(tài)顯示title操作(溢出顯示,不溢出不顯示)
這篇文章主要介紹了vue封裝自定義指令之動(dòng)態(tài)顯示title操作(溢出顯示,不溢出不顯示),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Vue實(shí)現(xiàn)動(dòng)態(tài)樣式的多種方法匯總
本文要給大家介紹Vue實(shí)現(xiàn)動(dòng)態(tài)樣式的多種方法,下面給大家?guī)?lái)幾個(gè)案列,需要的朋友可以借鑒研究一下。2021-06-06
如何使用 Deepseek 寫(xiě)的uniapp油耗計(jì)算器
這篇文章主要介紹了如何使用 Deepseek 寫(xiě)的uniapp油耗計(jì)算器,下面是一個(gè)基于 Uniapp 的油耗計(jì)算器實(shí)現(xiàn),包含 Vue 組件和頁(yè)面代碼,需要的朋友可以參考下2025-04-04
vue3組件的v-model:value與v-model的區(qū)別解析
在Vue3中,v-model和v-model:value都是用于實(shí)現(xiàn)雙向數(shù)據(jù)綁定的語(yǔ)法糖,但v-model:value提供了更顯式和靈活的綁定方式,允許你明確指定綁定的屬性名和事件名,它們的主要區(qū)別在于默認(rèn)行為、靈活性、多模型綁定和使用場(chǎng)景,感興趣的朋友一起看看吧2025-02-02
Vue實(shí)現(xiàn)Echarts圖表寬高自適應(yīng)的實(shí)踐
本文主要介紹了Vue實(shí)現(xiàn)Echarts圖表寬高自適應(yīng)的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
vue項(xiàng)目中實(shí)現(xiàn)全局引入jquery
這篇文章主要介紹了vue項(xiàng)目中實(shí)現(xiàn)全局引入jquery方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
詳解從Vue.js源碼看異步更新DOM策略及nextTick
本篇文章主要介紹了從Vue.js源碼看異步更新DOM策略及nextTick,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一2017-10-10

