最近在用polymer封裝純數字的輸入框,開發過程中發現不是坑,也有不少值得研究的地方。本系列打算分4篇來叙述這段可歌可泣的踩坑經曆:
<a href="http://www.cnblogs.com/fsjohnhuang/p/6929167.html">《動手寫個數字輸入框2:起手式——攔截非法字元》</a>
《動手寫個數字輸入框3:痛點——輸入法是個魔鬼》
《動手寫個數字輸入框4:魔鬼在細節——打磨光标位置》
從《動手寫個數字輸入框1:input[type=number]的遺憾》中我們了解到<code>input[type=number]</code>基本不能滿足我們的需求,為了簡單化我們就直接在<code>input[type=text]</code>上加工出自己的數字輸入框吧。
首先很明确的一點是最終數值可以包含以下字元<code>[+-0-9.]</code>,而可輸入的功能鍵為<code>backspace</code>,<code>delete</code>,<code>arrow-left</code>,<code>arrow-right</code>,<code>arrow-up</code>,<code>arrow-down</code>和<code>tab</code>。
于是我們可以設定如下規則了
還記得min,max,precision嗎?
當min大于等于0時,負号應該被納入非法字元;
當max小于0時,正号應該被納入非法字元;
當precision為0時,小數點應該被納入非法字元。于是我們添加如下規則,并修改一下<code>isvalid</code>就好了
到這裡為止我們已經成功地攔截了各種非法字元,也就是最終值必須之含<code>[+-0-9.]</code>,但含這些字元跟整體符合數值格式就是兩回事了。是以我們要繼續補充下面兩步,并且由于keydown事件觸發時value值還沒被修改,于是我們需要将value值和目前輸入值做組合來做預判,進一步擴大非法字元集。
通過正則檢查最終值是否符合格式要求(是否存在多個小數點也會在這一步處理掉);
檢查最終值是否在<code>min</code>和<code>max</code>範圍内。
現在可以終于可以牢牢控制住使用者輸入了,直到使用者切換到ime為止:-<當使用ime輸入時會發現上述措施一點用也沒有,不用皺眉了,後面我們會一起把ime ko掉!