【问题标题】:JS form validation. Check if field(s) exist if so execute function(s) if it returns true than submit the formJS 表单验证。检查字段是否存在,如果存在则执行函数,如果它返回 true,则提交表单
【发布时间】:2020-01-27 17:01:59
【问题描述】:

我有一个函数可以通过 formDOM 元素。它通过数据属性检查该字段是否存在。例如:data-validate-email 如果是这种情况,则需要使用相应的函数进行验证,例如 emailIsValid()

这些函数都返回带有truefalse布尔值。如果其中一个函数返回 false,我如何管理/跟踪,以便我可以阻止表单提交。全局变量不起作用,因为它被下一个函数覆盖。

onSubmit(form, event)
{
    event.preventDefault();

    const fields = form.querySelectorAll( `[${textValidation}]`);
    const passwordField = form.querySelector(`[${passwordValidation}]`);
    const repeatPasswordField = form.querySelector(`[${passwordRepeatValidation}]`);
    const email = form.querySelector(`[${emailValidation}]`);

    if(fields)
    {
        this.TextIsValid(fields);
    }

    if(email)
    {
        this.emailIsValid(email);
    }

    if(passwordField)
    {
        this.passwordStrengthIsValid(passwordField);
    }

    if(repeatPasswordField)
    {
        this.passwordMatches(passwordField, repeatPasswordField);
    }
}

【问题讨论】:

  • 您研究过 HTML5 表单验证吗?现在很多这些东西都是内置的,只要你的验证规则可以用这些来表达。 developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation
  • 我正在使用一些 HTML5 验证,但例如使用电子邮件,它只检查您是否使用 foo@bar,因此它不检查后缀
  • 即使你提供了一个正则表达式模式来检查?

标签: javascript html forms validation


【解决方案1】:

使用您当前的解决方案,这样的事情会起作用:

onSubmit(form, event)
{
    event.preventDefault();

    const fields = form.querySelectorAll( `[${textValidation}]`);
    const passwordField = form.querySelector(`[${passwordValidation}]`);
    const repeatPasswordField = form.querySelector(`[${passwordRepeatValidation}]`);
    const email = form.querySelector(`[${emailValidation}]`);
    const isValid = true;

    if(fields && !this.TextIsValid(fields))
    {
        isValid = false;
    }

    if(email && !this.emailIsValid(email);)
    {
        isValid = false;
    }
    // And so on...
}

这样,如果其中一个验证通过,您的“全局”isValid 变量将不会被覆盖为 true。只有在验证未通过时才能将其分配为 false。

【讨论】:

    【解决方案2】:

    您可以使用Arrayfilter 来解决这个问题。

    onSubmit(form, event);
    {
      event.preventDefault();
      let validation = [];
    
      const fields = form.querySelectorAll(`[${textValidation}]`);
      const passwordField = form.querySelector(`[${passwordValidation}]`);
      const repeatPasswordField = form.querySelector(
        `[${passwordRepeatValidation}]`
      );
      const email = form.querySelector(`[${emailValidation}]`);
    
      if (fields) {
        validation.push(this.TextIsValid(fields));
      }
    
      if (email) {
        validation.push(this.emailIsValid(email));
      }
    
      if (passwordField) {
        validation.push(this.passwordStrengthIsValid(passwordField));
      }
    
      if (repeatPasswordField) {
        validation.push(this.passwordMatches(passwordField, repeatPasswordField));
      }
    
      // Filter the array with false value and then check the array length. 
      let validationStatus  = validation.filter(item => !item);
      if(validationStatus.length === 0) {
        //submit your form
      }
    }
    

    【讨论】:

      【解决方案3】:

      您可以将全局变量 finalStatus 与逻辑运算符 && 结合使用

      onSubmit(form, event)
      {
          event.preventDefault();
      
          let isValid = true;
      
          const fields = form.querySelectorAll( `[${textValidation}]`);
          const passwordField = form.querySelector(`[${passwordValidation}]`);
          const repeatPasswordField = form.querySelector(`[${passwordRepeatValidation}]`);
          const email = form.querySelector(`[${emailValidation}]`);
      
          if(fields)
          {
              isValid = isValid && this.TextIsValid(fields);
          }
      
          if(email)
          {
              isValid= isValid && this.emailIsValid(email);
          }
      
          if(passwordField)
          {
              isValid= isValid && this.passwordStrengthIsValid(passwordField);
          }
      
          if(repeatPasswordField)
          {
              isValid= isValid && this.passwordMatches(passwordField, repeatPasswordField);
          }
      
          console.log(isValid)
      }
      

      您甚至可以通过检查iffinalStatus 的状态来缩短流程,以避免在状态已经为false 时进入

      if(isValid && email)
      

      【讨论】:

      • @Marc,你能描述一下为什么它不起作用吗?
      • 我错了说它不起作用,但有这个概念。如果其中一个验证函数返回 false。它不再检查其他字段,因为isValid && ..... 这意味着它不会向用户抛出错误消息。您希望用户向用户通知每个字段的警告/错误
      • @Marc 如果您将isValid 放入您的if 中,则不会检查其他字段,如我回答的最后一部分所述。只需将其从您的if 中删除,因为它位于答案的第一部分
      • 问题不在 if 里面。 isValid = isValid && this.TextIsValid(fields); 如果返回 false,它将永远不会执行该函数,因为在下一个 && 运算符中 isValid 为 false。如果删除 isValid,该函数将覆盖该值。因此,如果 4 为假,而最后一个为真。它说它是有效的,但事实并非如此。
      • @Marc 然后反其道而行之:this.textIsValid(fields) && isValid
      猜你喜欢
      • 1970-01-01
      • 2015-01-08
      • 2015-01-18
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多