2018-02-08
在做年度统计图的时候,需要输入年份,在不使用年份插件的情况下只允许输入数字,自然而然的想到了数字框
报表控件提供了数字框控件,经实际测试,在键盘不开启中文输入法的情况下,只能输入数字,但是有一些符号是例外,比如单引号和英文逗号:
一旦开启中文输入法,则数字框完全失效。这同大多前端框架提供的数字框控件类似。由于ime-mode还不是W3C标准,
除了IE外其他浏览器都不支持这个属性,因此想要用控件加属性me-mode的方式来控制只允许输入数字就行不通了,还是得老老实实的写正则表达式。
在数字框montn_sta_input中添加编辑后事件如下:
编辑后事件无非就是取值然后替换最后赋值,但是实际上如第一个截图所示,并没有起到想要的效果,反而还报错。
考虑到replace()是不会错的,那么只有用来替换的值类型不对了,毕竟replace()只替换字符串。
控制台打印类型:
果然如我所料,打印出来结果显示数字框控件的值并不是string而是number,那么replace()报错也是必然的。
想要在中文输入法下不允许输入非数字,那么就把非数字替换掉,替换函数只能字符串替换,那么就不能用数字框控件。
于是还是换回文本框,在文本框里写编辑后事件,无论输入法是否开启,非数字都无法输入。
注意上述正则表达式是可以输入小数的并且没有限制精度。
事件代码如下:
var obj = this.options.form.getWidgetByName("month_sta_input1").getValue(); //month_sta_input1即是年度文本框
console.log("****obj="+typeof(obj));
console.log("****obj111="+obj);
obj = obj.replace(/[^\d.]/g,""); //清除“数字”和“.”以外的字符
obj = obj.replace(/^\./g,""); //验证第一个字符是数字而不是.
obj = obj.replace(/\.{2,}/g,"."); //只保留第一个. 清除多余的.
obj = obj.replace(".","$#$").replace(/\./g,"").replace("$#$",".");//保证.只出现一次,而不能出现两次以上
console.log("****obj222="+obj);
this.options.form.getWidgetByName("month_sta_input1").setValue(obj);