当同一页面上有多个使用同一个类时,如何验证电子邮件提交表单?

Posted

技术标签:

【中文标题】当同一页面上有多个使用同一个类时,如何验证电子邮件提交表单?【英文标题】:How to Validate an Email Submission Form When There Are Multiple on the Same Page Using the Same Class? 【发布时间】:2018-04-07 03:44:33 【问题描述】:

我在一页上有三个电子邮件表单,都使用同一个类。当有人输入电子邮件地址并提交其中一个表单时,我想验证输入该特定表单的电子邮件地址。我遇到的问题是有人为后来的一个表单输入了一个电子邮件地址,它会根据第一个表单中的数据进行验证。如何使我的验证函数验证输入电子邮件地址的字段,而不必为每个表单提供唯一 ID 并多次验证代码?

验证代码如下和其中一种形式的代码。谢谢!

               <script>
                    function validateMyForm() 
                            var sEmail = $('.one-field-pardot-form-handler').val();
                            if ($.trim(sEmail).length == 0) 
                                event.preventDefault();
                                alert('Please enter valid email address.');
                                return false;

                            

                            if (validateEmail(sEmail)) 

                            

                            else 
                                event.preventDefault();
                                alert('Invalid Email Address. Please try again.');                          
                    ;

                    function validateEmail(sEmail) 
                        var filter = /^([\w-\.]+)@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.)|(([\w-]+\.)+))([a-zA-Z]2,4|[0-9]1,3)(\]?)$/;
                        if (filter.test(sEmail)) 
                            return true;
                        
                        else 
                            return false;
                        
                                                                      

                 </script>  

                 <form action="https://go.pardot.com/l/43312/2017-10-24/7dnr3n" method="post" onSubmit="return validateMyForm();" novalidate>

                    <input class="one-field-pardot-form-handler" maxlength="80" name="email" size="20" type="email" placeholder="Enter Email Address" required="required" />
                    <div style="position:absolute; left:-9999px; top: -9999px;">
                      <label for="pardot_extra_field">Comments</label>
                      <input type="text" id="pardot_extra_field" name="pardot_extra_field">
                    </div>

                    <button type="submit" name="submit">Submit</button>
                </form>

【问题讨论】:

你不能检查哪个输入有一个值,然后验证它的父表单吗?或者在提交时验证输入中包含值的每个表单(如果用户可以在多个表单中输入电子邮件)? 【参考方案1】:

与其从 html onsubmit 属性调用方法,不如在 jquery 中连接整个事情。

$('form.myform').submit(function(e)
   var $theForm = $(this);
   var $theEmailInput = $theForm.find('.one-field-pardot-form-handler');
   validateEmail($theEmailInput.val());
);

【讨论】:

你可以写var theForm = $(this); var theEmailInput = theForm.find('.one-field-pardot-form-handler');而不是var theEmailInput = $('.one-field-pardot-form-handler', this); @JoshuaK 当然,因为 OP 似乎很新,所以我试图明确表示。 好的。一些“改进”:根据 jquery 命名约定,它应该是 $theForm$theEmailInput。对于新手来说,在所有 jQuery 集合前面加上 $ 符号是一个很好的记忆道具。 @Paul 这是一个非常普遍的约定,早在 JQuery 出现在 CDN 之前。 @Paul 这是 2009 年的 SO post【参考方案2】:

如果您有 3 个表单,只需在表单上下文中定位电子邮件字段(通过类)

而且,不要使用内联 HTML 事件属性(onsubmit 等),原因有很多,您可以阅读这些 here。 相反,使用 javascript/JQuery 进行所有事件绑定,如果您已经在使用 .preventDefault(),则无需担心 return false 会取消事件。此外,最好将事件引用捕获为事件回调函数的参数,而不是全局 event 对象。

还有其他项目也应该调整,所以请参阅其他 cmets inline:

// Get all the form elements and set up their event handlers in JavaScript, not HTML
$("form").on("submit", validateMyForm);

function validateMyForm(evt) 
  // First, get the form that is being filled out
  var frm = evt.target;
  evt.preventDefault();
  
  // Now, just supply the form reference as context for the email search
  // Notice the extra argument after the selector "frm"? That tells JQuery
  // where within the DOM tree to search for the element.
  var sEmail = $('.one-field-pardot-form-handler', frm).val();
  
  // Just to show that we've got the right field:
  $('.one-field-pardot-form-handler', frm).css("background-color", "yellow");
  // ***************************************************************************
  
  // No need to convert a string to a JQuery object and call .trim() on it
  // when native JavaScript has a .trim() string method:
  if (sEmail.trim().length == 0) 
    evt.preventDefault();
    alert('Please enter valid email address.');
  

  // Don't have empty branches, reverse the logic to avoid that
  if (!validateEmail(sEmail)) 
    evt.preventDefault();
    alert('Invalid Email Address. Please try again.');                         
  



function validateEmail(sEmail) 
  var filter = /^([\w-\.]+)@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.)|(([\w-]+\.)+))([a-zA-Z]2,4|[0-9]1,3)(\]?)$/;
  
  return filter.test(sEmail);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="https://go.pardot.com/l/43312/2017-10-24/7dnr3n" 
      method="post" 
      novalidate>
  <input class="one-field-pardot-form-handler" 
         maxlength="80" 
         name="email" 
         size="20" 
         type="email" 
         placeholder="Enter Email Address" 
         required>
  <div style="position:absolute; left:-9999px; top: -9999px;">
    <label for="pardot_extra_field">Comments</label>
    <input type="text" id="pardot_extra_field" name="pardot_extra_field">
  </div>

  <button type="submit" name="submit">Submit</button>
</form>
<form action="https://go.pardot.com/l/43312/2017-10-24/7dnr3n" 
      method="post" 
      novalidate>
  <input class="one-field-pardot-form-handler" 
         maxlength="80" 
         name="email" 
         size="20" 
         type="email" 
         placeholder="Enter Email Address" 
         required>
  <div style="position:absolute; left:-9999px; top: -9999px;">
    <label for="pardot_extra_field">Comments</label>
    <input type="text" id="pardot_extra_field" name="pardot_extra_field">
  </div>

  <button type="submit" name="submit">Submit</button>
</form>
<form action="https://go.pardot.com/l/43312/2017-10-24/7dnr3n" 
      method="post" 
      novalidate>
  <input class="one-field-pardot-form-handler" 
         maxlength="80" 
         name="email" 
         size="20" 
         type="email" 
         placeholder="Enter Email Address" 
         required>
  <div style="position:absolute; left:-9999px; top: -9999px;">
    <label for="pardot_extra_field">Comments</label>
    <input type="text" id="pardot_extra_field" name="pardot_extra_field">
  </div>

  <button type="submit" name="submit">Submit</button>
</form>

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。【参考方案3】:

所以上面@paul 和@ScottMarcus 的答案的组合最终让我到达了我需要去的地方。以下是我最终得到的结果,它按预期工作。正如其他人所指出的,我绝对是一个 n00b 并且只是学习 javascript,所以肯定可能并不完美:

<script>
$('form.pardot-email-form-handler').submit(function(event) 
var theForm = $(this);
var theEmailInput = theForm.find('.one-field-pardot-form-handler');
var theEmailValue = theEmailInput.val();

function validateEmail(theEmailValue) 
var filter = /^([\w-\.]+)@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.)|(([\w-]+\.)+))([a-zA-Z]2,4|[0-9]1,3)(\]?)$/;
if (filter.test(theEmailValue)) 
return true;
 else 
return false;



if (!validateEmail(theEmailValue)) 
event.preventDefault();
alert('Invalid Email Address. Please try again.');
 else 
return true;


);
</script>
<div class="nav-email-form">    
<form action="https://go.pardot.com/l/43312/2017-10-24/7dnr3n" method="post" class="pardot-email-form-handler" novalidate>

<input class="one-field-pardot-form-handler" maxlength="80" name="email" size="20" type="email" placeholder="Enter Email Address" required="required" />
<div style="position:absolute; left:-9999px; top: -9999px;">
<label for="pardot_extra_field">Comments</label>
<input type="text" id="pardot_extra_field" name="pardot_extra_field">
</div>

<button type="submit" name="submit">Submit</button>
</form>

</div>

【讨论】:

以上是关于当同一页面上有多个使用同一个类时,如何验证电子邮件提交表单?的主要内容,如果未能解决你的问题,请参考以下文章

我在同一页面上有多个 jPicker,如何一次打开一个 jPicker 对话框?

为同一表单提交多个 addEventListener

Zend Form - 一页中的多个表单和(CSRF)令牌验证

如何在单个页面上显示多个recaptchas?

JQuery 验证问题:我在同一页面上有 2 个表单,每个表单在 2 个不同的选项卡中,但只有一个验证不起作用

Laravel 4 - 同一页面上有多个表单?