Knockout - 将输入限制为仅包含一个小数点的数字

时间:2014-12-19 17:31:29

标签: 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();
                        }

3 个答案:

答案 0 :(得分:1)

所以我必须说我并没有真正看到明确允许的逻辑;相反,你应该明确排除,因为默认情况下允许一切。你购买了一台计算机,它已经超过你的所有标准,你不买10台电脑,然后扔掉那些不符合你标准的电脑。因此,无需触摸 Ctrl &amp;其他功能键,你不必要地复杂化 如果您仔细查看极长的if条款,您会注意到以下内容:您(event.keyCode === 190所指的// let it happen, don't do anything。因此,无论如何都会添加句​​号。以下是您当前方法的问题:

  • 使用keydown事件,所有密钥代码都会生成相同的,其中包含 Caps Lock ,因为它们是相同的密钥< / em>的。因此,您无法区分句点.和分号;
  • 使用keydown事件,键盘上和键盘上相同数字的键码是不同,因为它们是不同的
  • 禁用 Shift 键(与您一样),强制AZERTY用户使用Caps Lock,因为当Shift关闭时,AZERTY键盘会产生非数字字符。

因此,您最好使用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之间做差异很糟糕,所以它会混乱并禁用所有控制键。

答案 1 :(得分:0)

if ((yourString.match(new RegExp(".", "g")) || []).length > 1) {
  // yourString contains more than one "."
}

答案 2 :(得分:0)

我修改了自己的代码并认为我在这里分享了它:

// 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
        (event.keyCode === 65 && (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, but check for excessive periods
        if ((event.keyCode === 190 || event.keyCode === 110) && $(element).val().indexOf('.') !== -1) {
            event.preventDefault();
        }
        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();
        }
    }
});

我添加了以下代码,允许使用某些密钥代码:

if ((event.keyCode === 190 || event.keyCode === 110) && $(element).val().indexOf('.') !== -1) {
    event.preventDefault();
}