【问题标题】:validate input type="number"验证输入类型 =“数字”
【发布时间】:2014-08-12 12:14:50
【问题描述】:

我尝试做一些编程: 我有这个带有不同输入字段(名称、amountOfProductA、amountOfProductB、amountOfProduct...)的订单表格,经过一些验证后,我使用 jquery 脚本提交了这个表格。

  • 我计划重复使用代码,产品字段的数量可能会不时变化。
  • 在验证中,我确保至少填写了一个 (type="number") 产品输入字段。
  • 如果用户在其中一个产品输入字段中输入了一个数字,而在另一个输入字段中错误地输入了一个字符(或一个数字和一个字符),则表单会在后面的字段为空的情况下提交。
  • 由于填写错误的字段提交为空,我无法验证这一点。

您能否告诉我如何验证这一点? 我应该只使用 type="text" 输入字段吗? (如何检查是否至少填写了一个产品字段?)

这是我的代码:

jQuery(function ($) {
$('#bttn-submit').click(function () {

    $('input').css('background', '#fff'); // reset BGcolor

    var formOk = true;
    var allProdFields = $('input[type=number]') // Selection of all Product('number') fields
    var numberOfProdFields = allProdFields.length; // How many ('number') fields are there?

    // How many product fields are empty?
    var prodFieldsEmpty = 0;
    for (i = 0; i < numberOfProdFields; i++) {
        if( $(allProdFields[i]).val() == '' || $(allProdFields[i]).val() == 0){
            prodFieldsEmpty++;
            }
    }
    // Is there at least one product field filled?
    if(prodFieldsEmpty == numberOfProdFields){
        var formOk = false; 
        alert('Form not OK');
        allProdFields.css('background', '#f30302');
    }

    // Is the name field filled?
    if( $('#pesoonNaam').val() == '') {
        $('#pesoonNaam').css('background', '#f30302');
        var formOk = false; 
    }

    if( formOk == true ) {
        document.actieForm.submit();
    }
})
})

【问题讨论】:

标签: javascript jquery forms validation


【解决方案1】:

下面的代码不会让用户在您的字段中输入字符,只有数字。因为 type="number" 是 html5 并且不适用于所有浏览器。

   $(document).on('keydown', '.numeric-input', function(event) {
        var dot_split = $(this).val().split('.');
        if ($.inArray(event.keyCode,[46,8,9,27,13]) !== -1 || (event.keyCode == 65 && event.ctrlKey === true) || (event.keyCode >= 35 && event.keyCode <= 39) && dot_split.length <= 2) {
            // 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(); 
            }   
        }
    })

然后您可以使用 .each 检查是否有任何字段为空。

prodFieldsEmpty = 0;
$('.numeric-input').each(function(){
   if($(this).val() != ""){
      prodFieldsEmpty++;
   }
})

希望对您有所帮助!

【讨论】:

  • 除非不按任何键输入值,否则完全失败。 :-(
  • 哪个部分完全失败了,因为我使用了相同的代码并且它工作正常?
  • @IdealBakija——The code below will not let the user enter character in your field only number。如果用户将值粘贴或拖动到字段(或以任何其他不分派 keydown 事件的方式输入内容),该部分将失败。而且由于您的代码无法可靠地阻止输入非数字,因此仅检查非空字段是不够的验证。
  • 在大多数情况下它都有效。我测试了过去的命令,它不允许您粘贴任何内容,而不仅仅是字符。允许拖动。我想应该有一些其他代码可以防止其他字符插入情况。直到所有浏览器都支持 type="number"。谢谢指正。
【解决方案2】:

你可以试试:

function checkInputs(){
   result = false;
   $('input[type="number"]').each(function(){
       if($(this).val() != '' && isNumeric($(this).val())) result = true;
   })
   return result;
 }

更新:Fiddle

【讨论】:

  • 感谢您的努力!但这显然对我来说目前很难实施。
  • isNumeric 定义在哪里?
  • @RobG 在我上面的代码中,你可以在小提琴中看到它。我没有在这里发布完整的代码。
【解决方案3】:

您不应该将验证附加到提交按钮,因为用户可以在不按下它的情况下提交表单,请将验证附加到表单的提交处理程序:

jQuery(function ($) {
    $('#formID').submit(
        ...

jQuery 有一个each 用于迭代的方法,所以:

    $('input[type=number]').each( function(index) {

       /* do validation */

    });

each中,函数的this被设置为当前元素,所以可以这样做:

     if (this.value == 0) {
        prodFieldsEmpty++;
     }

表单控件的值始终是字符串,因此如果值为'0'''(空字符串),测试this.value == 0 将返回true。如果您不喜欢使用类型强制,请执行以下操作:

     if (this.value === '0' || this.value === '') {

如果您想检查该值是否为整数,那么这里有很多答案,最简单的可能是接受的答案here

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

请注意,这将允许所有类型的数字,例如2.34e3。如果您只想允许说正整数,可以尝试:

function isPositiveInt(n) {
  return /^\d+$/.test(n);  // or return !/\D/.test(n)
}

同样,有很多方法可以解决这个问题。

与其先计算字段的数量,然后再计算通过的数量,如果您只想检查是否至少有一个通过,请设置一个标志:

    var passNumeric = false;
    $('input[type=number]').each( function(index) {

      if (isNumber(this.value)) {
        passNumeric = true;

      } else {
        // do something with fails?
      }
    });

你可以使用 else 分支来处理失败(或什么都不做)。

【讨论】:

  • 非常感谢您提供所有这些使用完整的信息!我去看看。
猜你喜欢
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多