本文主要針對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,自己寫一個鍵盤組件,不過記得考慮兼容性。
感謝閱讀,如果你有更好的解決方案,希望你能在評論給出,一起討論,感激不盡。