移動端input框type為number仍可以輸入中文的問題

本文主要針對IOS做了測試,對安卓測試較少,但問題應(yīng)該是通用的。

首先這個問題非常棘手,因為這可能是瀏覽器的一個bug,當用戶在type=number的input框輸入中文時,這個值其實并不會被接收,但是有時會被展現(xiàn)。即:它會像普通值一樣顯示,但是雙向綁定的參數(shù)接收不到中文值,一般為空字符串。

type=number會吊起數(shù)字鍵盤,很多產(chǎn)品設(shè)計傾向于此,但是目前來看各系統(tǒng)(瀏覽器)對此兼容并不好。

這類輸入一般來源于非標準輸入或空input框聚焦時,哪怕是type=number,ios鍵盤也會在上面推薦常用中文...

原理

點擊輸入法上面的推薦中文,onchange函數(shù)并不會被觸發(fā),可能這是一個粘貼操作,或者前后值沒有差異(中文被攔截后還是空字符串)

同時onkeydown等也不會被觸發(fā)。這個行為就像一個幽靈行為,無法定位。

解決

經(jīng)過各種事件的嘗試,最終發(fā)現(xiàn)oninput會監(jiān)聽到此行為(我早該想到的)。

但是抓輸入值的方式略有不同,以vue為例,應(yīng)為$event.data,oinput接收到的參數(shù)為inputEvent,即輸入事件,而不是dom。

并且這個接收到的值為本次輸入/粘貼等過來的值,而不是input框中所有的值。

筆者發(fā)現(xiàn),oninput不能像onkeydown等事件一樣阻止冒泡和默認行為。

最終筆者解決的方案為

1.在keydown時存儲舊值,所有input共用一個變量就好

2.oninput時對本次加入的值進行校驗,可以采用正則等方式。

3.如果通過校驗,不用進行操作。不通過時,對input雙向綁定的值進行舊值賦值,這可能會觸發(fā)input的更新,就不會出現(xiàn)中文,也沒有閃現(xiàn)的情況,表現(xiàn)就是中文沒有輸入進去。

解決2

不采用input=number,自己寫一個鍵盤組件,不過記得考慮兼容性。

感謝閱讀,如果你有更好的解決方案,希望你能在評論給出,一起討論,感激不盡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容