天天看点

动手写个数字输入框2:起手式——拦截非法字符

 最近在用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为止:-&lt;当使用ime输入时会发现上述措施一点用也没有,不用皱眉了,后面我们会一起把ime ko掉!