JQuery验证函数在页面加载和抛出错误时触发

时间:2017-05-19 23:23:34

标签: javascript jquery

背景

我有一个包含许多不同输入字段的表单。我正在使用一些jquery functions来验证keyup上的输入字段。

keyup event触发时,每个函数都会根据函数的响应返回true或false。

这些功能看起来像这样,

示例1

// First Name
var validate_first_name = function(first_name){
  var pattern =  /^[a-zA-Z'\s]{2,35}$/;
  var is_first_name_valid = false;
  if(first_name.match(pattern) != null){
    is_first_name_valid = true;
  }
  return is_first_name_valid;
}

$(document).on("keyup", "#first_name", function(){
  var input_val = $(this).val();
  var is_success = validate_first_name(input_val);
  if(!is_success){
    $('#first_name_val').addClass('fa-close').removeClass('fa-user-o').removeClass('fa-check');
  } else {
    $('#first_name_val').addClass('fa-check').removeClass('fa-user-o').removeClass('fa-close');
  }
});

问题

我有大量的这些功能,我想禁用 submit button ,直到这些功能 returns true 为止。

我尝试过什么

我已经尝试了以下解决方案的一些变体,这些变体要么禁用按钮并且无法启用它,要么永远不会禁用该按钮。我也试过移动

之外的函数

$(document).ready(function() {}

我认为此解决方案会导致错误,因为它会尝试检查

的值
    validate_first_name function  
在它keypup event发射之前

错误

  

jquery-3.2.1.min.js:2未捕获的TypeError:无法读取属性'匹配'   未定义的       在validate_first_name(customer-primary.js:87)       在validate(customer-primary.js:365)

示例2

// Check Validation or Disable Submit Button
function validate(){
    if (validate_first_name()       === true &&
        validate_last_name()        === true ){
        $('#submit').prop("disabled", false);
    } else {
        $('#submit').prop("disabled", true);
    }
}

validate();
    $(
      '#first_name',
      '#last_name'
    ).change(validate);
}); // End Document Ready Function

1 个答案:

答案 0 :(得分:0)

var Validate = function(form, elements) {

  /* PS: checkValid -> checks all the elements are valid */
  /* check if pattern matches and call checkValid */
  var validate = function(pattern, checkValid) {
    return function() {
      if (!this.value.match(pattern)) {
        /* remove 'valid' classes and add 'invalid' classes */
        this.classList.add('invalid');
        this.classList.remove('valid');
        this.valid = false;
      } else {
        /* 'reverse' add valid classes */
        this.classList.remove('invalid');
        this.classList.add('valid');
        this.valid = true;
      }
      checkValid();
    };
  };

  /* get the form with jquery */
  var $form = $(form);

  /* get the first button in form */
  var xButton = $form[0].getElementsByTagName('button')[0];
  xButton.disabled = true;

  /* check if all elements are valid */
  var checkValid = function() {
    var xFormValid = true;
    /* if one of the xElements / inputs is not valid */
    for (var key in elements) {
      if (elements.hasOwnProperty(key)) {
        var xElement = $form[0].elements[key];
        if (xElement.valid !== true) {
          xFormValid = false;
          break;
        }
      }
    }
    if (xFormValid) {
      xButton.disabled = false;
    } else {
      xButton.disabled = true;
    }
  };
  /* each element in form */
  for (var key in elements) {
    if (elements.hasOwnProperty(key)) {
      var xElement = $form[0].elements[key];
      var pattern = elements[key];

      /* set onkey up to validate(pattern, checkValidated) */
      xElement.onkeyup = validate(pattern, checkValid);
    }
  }
};

/* <form id="form1"> */
Validate('#form1', {
  /* <input name="firstName"> */
  firstName: /^[a-zA-Z'\s]{2,35}$/,
  /* <input name="lastName"> */
  lastName: /^[a-zA-Z'\s]{2,35}$/,
  /* <input name="email"> */
  email: /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
});

Validate('#form2', {
  first_name: /^[a-zA-Z'\s]{2,35}$/,
  last_name: /^[a-zA-Z'\s]{2,35}$/,
});
.valid,
.invalid:active,
.invalid:focus {
  border: 1px solid green;
  outline: 1px solid green;
}

.invalid,
.invalid:active,
.invalid:focus {
  border: 1px solid red;
  outline: 1px solid red;
}

button:disabled {
  color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form1">
  <p>
    <label>FIRST NAME</label>
    <input type="text" name="firstName">
  </p>
  <p>
    <label>LAST NAME</label>
    <input type="text" name="lastName">
  </p>
  <p>
    <label>EMAIL</label>
    <input type="text" name="email">
  </p>
  <p>
    <button type="submit">SUBMIT</button>
  </p>
</form>

<hr>

<form id="form2">
  <p>
    <label>FIRST NAME</label>
    <input type="text" name="first_name">
  </p>
  <p>
    <label>LAST NAME</label>
    <input type="text" name="last_name">
  </p>
  <p>
    <button type="submit">SUBMIT</button>
  </p>
</form>