javascript - knockout - 限制输入仅包含一位小数点的数字

标签 javascript forms knockout.js

我有下面的代码,它确实将输入限制为仅数字和选定数量的组合键。但我还想限制输入只接受一位小数点。

number: {
            init: function (element) {
                // Allows only numbers with decimals
                $(element).on("keydown", function (event) {
                    // Allow: backspace, delete, tab, escape, and enter
                    if (event.keyCode === 46 || event.keyCode === 8 || event.keyCode === 9 || event.keyCode === 27 || event.keyCode === 13 ||
                        // Allow: Ctrl+A, Ctrl + C, Ctrl + V, Ctrl + X
                        ((event.keyCode === 65 || event.keyCode === 67 || event.keyCode === 86 || event.keyCode === 88) && (event.ctrlKey === true || event.metaKey === true)) ||
                        // Allow: .
                        (event.keyCode === 190 || event.keyCode === 110) ||
                        // Allow: home, end, left, right
                        (event.keyCode >= 35 && event.keyCode <= 39)) {
                        // let it happen, don't do anything
                        return;
                    } else {
                        // Ensure that it is a number and stop the keypress
                        if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                            event.preventDefault();
                        }
                    }
                });
            }
        }

我尝试添加 '$(element).val().indexOf('.') !== -1' 如下所示,但它没有执行任何操作,我仍然可以输入我想要多少个周期。我实际上应该如何限制它?

if (event.shiftKey || ($(element).val().indexOf('.') !== -1 && (event.keyCode === 190 || event.keyCode === 110)) || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                event.preventDefault();
                        }

最佳答案

所以我必须说我并没有真正看到显式允许的逻辑;相反,您应该明确排除,因为默认情况下一切都是允许的。你买一台电脑是在它满足了你所有的标准之后才买的,你不会买10台电脑,然后扔掉那些不符合你标准的电脑。因此,无需触摸 Ctrl 和其他功能键,这会让事情变得不必要的复杂。
如果您仔细查看极长的 if 子句,您会注意到以下内容:
(event.keyCode === 190,其中您声明了 //让它发生,不要做任何事情。因此无论如何都会添加句​​点。以下是当前方法的陷阱:

  • 通过 keydown 事件,无论 Caps Lock 是否开启,所有键码都会产生相同的,因为它们是相同的>键。因此您无法区分句点 . 和分号 ;.
  • 对于 keydown 事件,数字键盘和键盘上的相同数字的键码不同,因为它们是不同的
  • 禁用 Shift 键(就像您所做的那样)会强制 AZERTY 用户使用 Caps Lock,因为 AZERTY 键盘在 Shift 关闭时会生成非数字字符。

因此,您最好使用 keypress 事件,该事件返回字符值。这是一个重构且更加简洁的函数,它实现了完全相同的功能:

 $('#jquery').on("keypress", function (event) {
   var k = event.keyCode || event.charCode;
   if (k === 46 && this.value.match(/\./g) || (k < 48 && k !== 46 ) || k > 57) {                            
     event.preventDefault();
   }
 });

在这里测试一下:http://jsfiddle.net/kevinvanlierde/5ay3cory/6/

注意:因为 Mozilla Firefox 在区分 keydown 和 keypress 方面很糟糕,所以它会搞乱并禁用所有控制键。

关于javascript - knockout - 限制输入仅包含一位小数点的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27571040/

相关文章:

javascript - AngularJS 数据网格分页

javascript - 使用 Javascript 重置除一个字段之外的表单

javascript - 本身工作得很好,但当我把它放在表格的其余部分时就会爆炸

css - 在伪 css 选择器上使用 knockoutJS 绑定(bind)内容 css 属性的文本

javascript - 无论任何一个 div 中的内容长度是多少,让两列/div 具有匹配高度的最佳方法是什么?

javascript - 我如何获得与 jquery 匹配的类的第一个父级?

javascript - 如何限制 HighCharts 中的图表 xAxis 日期范围?

javascript - jQuery 验证 : determine if field was validated on form submit, 或差异。事件?

javascript - 创建一个工厂函数来创建 ko.compulated

javascript - Knockout.js 选择数据绑定(bind)值不被读取但被写入