我的联系表单验证的小错误。电子邮件验证与我的其余代码纠缠不清

Posted

技术标签:

【中文标题】我的联系表单验证的小错误。电子邮件验证与我的其余代码纠缠不清【英文标题】:Small bug with my contact form validation. Email validation is getting tangled with the rest of my code 【发布时间】:2017-12-17 08:39:48 【问题描述】:

我已经为我的联系表单编写了一些验证代码。执行时,代码将突出显示无效输入并显示(错误)标签。

虽然验证正常工作,但电子邮件输入未正确显示标签。代码如下:

 $(".cform").on("submit" , function(e)

   var hasError = false;

    $(".inputValidation").each(function()
      var $this = $(this);
      var $label = $("label[for='"+$(this).attr("id")+"']");
      var validateEmail = function(elementValue)
          var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]2,4$/;
    return emailPattern.test(elementValue);
      
      var value = $('#email').val();
      var valid = validateEmail(value);

      if($this.val() == "")
        hasError = true;
        $this.addClass("inputError");
        $label.addClass("label_error");
        e.preventDefault();
      if(!valid)
        $("#email").addClass("inputError");
        $label.addClass("label_error");
        e.preventDefault();
      if($this.val() != "")
       $this.removeClass("inputError");
       $label.removeClass("label_error");
      else
       return true;
     

    );
 );
.cform 
  width: 50%;


.cform .inputError 
	background-color: #ffffff;
  outline: 2.5px solid #900f0f;
  color: black;


.input_label 
	display: none;


.label_error 
	display: block;
	color: #900f0f;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form class="cform" action="" method="post">
					<label class="input_label" for="name">ERROR</label>
        	<input type="text" id="name" class="inputValidation shad" name="name" value="" placeholder="Name...">
					<label class="input_label" for="email">ERROR</label>
        	<input type="text" id="email" class="inputValidation shad" name="email" value="" placeholder="Email...">
					<label class="input_label" for="phone">ERROR</label>
        	<input type="text" id="phone" class="inputValidation shad" name="phone" value="" placeholder="Contact Number...">
					<label class="input_label" for="message">ERROR</label>
        	<textarea name="message" id="message" class="inputValidation shad" placeholder="Type your message here..."></textarea>
        <input type="submit" class="" name="sumbit" value="send">
      </form>

JSFiddle here

【问题讨论】:

你能举一个例子说明一组输入不能满足你的期望吗?在这里测试它,当我输入根据您的正则表达式有效的电子邮件时,我只会看到电子邮件错误(这在许多非美国域上会失败,地址为+用户名等,但这是一个不同的主题)。 【参考方案1】:

所以问题似乎是当电子邮件无效时您正确添加了错误标签类,但底部有一个 if 语句只检查了 val()!="" 这意味着如果电子邮件有有东西,但不是有效的电子邮件,标签仍然被删除。

最简单的解决方案是将 if 语句分开。

$(".cform").on("submit" , function(e)

var hasError = false;

$(".inputValidation").each(function()
  var $this = $(this);
  var $label = $("label[for='"+$(this).attr("id")+"']");
  var validateEmail = function(elementValue)
    var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]2,4$/;
    return emailPattern.test(elementValue);
  
  var value = $('#email').val();
  var valid = validateEmail(value);

  if($this.val() == "")
    hasError = true;
    $this.addClass("inputError");
    $label.addClass("label_error");
    e.preventDefault();
  else
    $this.removeClass("inputError");
    $label.removeClass("label_error");
  

  if(!valid)
    $("#email").addClass("inputError");
    $label.addClass("label_error");
    e.preventDefault();
  else
   $this.removeClass("inputError");
   $label.removeClass("label_error");
 

);
);

【讨论】:

【参考方案2】:

验证的顺序不正确。由电子邮件字段生成的错误,被非空验证覆盖。

 $(".cform").on("submit" , function(e)

   var hasError = false;

    $(".inputValidation").each(function()
      var $this = $(this);
      var $label = $("label[for='"+$(this).attr("id")+"']");
      var validateEmail = function(elementValue)
          var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]2,4$/;
    return emailPattern.test(elementValue);
      
      var value = $('#email').val();
      var valid = validateEmail(value);
	 	  //validation for mandatory start
      if($this.val() == "")
        hasError = true;
        $this.addClass("inputError");
        $label.addClass("label_error");
        e.preventDefault();
      	else
       $this.removeClass("inputError");
       $label.removeClass("label_error");
        return true;
      
      //validation for mandatory end

      //validation for email start
      if(!valid)
        $("#email").addClass("inputError");
        $label.addClass("label_error");
        e.preventDefault();
      
      else
       $this.removeClass("inputError");
       $label.removeClass("label_error");
      
     //validation for email end
      
    );
 );

【讨论】:

以上是关于我的联系表单验证的小错误。电子邮件验证与我的其余代码纠缠不清的主要内容,如果未能解决你的问题,请参考以下文章

联系表单验证以防止空白电子邮件

如何让我当前的 PHP 联系表单检查输入的电子邮件地址是不是有效? [复制]

Wordpress 登录表单验证

用于停止 WordPress 注册表单提交的 Javascript(电子邮件验证)

引导验证消息正在下推我的表单的其余部分

将验证码添加到响应式引导程序联系表单