【问题标题】:HTML5 form validation without Javascript validation没有 Javascript 验证的 HTML5 表单验证
【发布时间】:2016-12-01 15:25:14
【问题描述】:

我最近接触了 HTML5 表单验证的新(对我而言)主题。我成功地对其进行了测试,但我仍然对如何以及为什么使用它感到困惑。 让我试着用一个简单的例子来解释。

我的表单有 10 个字段(文本、数字、日期...);每个人都有自己的requiredpattern
visual 验证效果很好;每个字段都显示 Go/NoGo 状态:这很好。
但是,当涉及到使用 javascript 提交表单时,我是否必须重新验证每个字段?
换句话说,HTML5 验证只是一个视觉工件;它不会阻止表单提交。如果用户想输入错误的内容而不顾红旗,他可以做到。

如果我是正确的,我为什么要使用 HTML 来做一些我可以(而且我必须)用 JS 做的事情? 也许 JS 有办法知道一切正常,无需执行任何进一步检查。

【问题讨论】:

  • 没有什么是“你必须做的”。有不同的机会来解决手头的任务。拥有可供她使用的验证属性可以避免使用 javascript 进行简单的表单验证。有时没关系。有时你最好使用 javascript。

标签: javascript html forms validation


【解决方案1】:

换句话说,HTML5 验证只是一个视觉工件;它 不会阻止表单提交。

这不是它应该如何工作的。根据设计,HTML5 验证应该防止提交错误填写的表单。确实如此——in most browsers。不幸的是,a bug in Safari 会导致您描述的行为。所以在修复这个错误之前,是的,您可能还需要使用 JS 验证表单,但这不是因为 HTML5 验证的性质,只是因为 Safari 缺乏它的支持。

【讨论】:

    【解决方案2】:
    <form method="GET" action="Your Action Page" id="contact form">
    <div class="form-group">
    <label>Name</label>
    <input type="text" name="name" placeholder="name" id="name" class="form-control" required="true" pattern="[a-zA-z]+">
    </div>
    
    <div class="form-group">
    <label>Email</label>
    <input type="email" name="email" id="email" placeholder="email" class="form-control" required="true" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$">
    </div>
    
    <div class="form-group">
    <label>Mobile No:</label>
    <input type="tel" name="number" id="number" placeholder="Phone No"pattern="^\d{10}$" required="true" oninput="this.value = this.value.replace(/[^0-9.]/g, ''); this.value = this.value.replace(/(\..*)\./g, '$1');" onkeydown="if(this.value.length==10 &amp;&amp; event.keyCode!=8 &amp;&amp; event.charCode != 9 &amp;&amp; event.which != 9 ) return false">
    </div>
    
    <div class="submit-area">
    <input type="submit" id="submit-contact" name="submit" class="btn-alt" value="Send Message">
    <div id="msg" class="message"></div>
    </div>
    </form>
    

    【讨论】:

    • edit 你的答案并添加一些解释此代码如何解决问题
    • 面向初学者的基本 HTML5 表单验证
    【解决方案3】:

    当您通过 HTML 对表单元素应用 HTML 验证并且该元素的值不符合验证条件时,将不会提交表单。

    但是,如果涉及到 JavaScript,则必须控制此过程。最简单的方法是简单地检查表单的有效性。

    “但是,当使用 JavaScript 提交表单时,我是否必须重新验证每个字段?”

    正如您将在我的 sn-p 中看到的,您必须验证表单,这可以通过一个简单的方法调用来完成。如果需要,您可以检查每个元素以查看哪些无效以及原因并采取相应措施。

    "也就是说,HTML5验证只是一个视觉工件,它不会阻止表单提交。如果用户想输入错误的内容,而忽略红旗,他可以做到。 "

    当您只使用 HTML 而不使用 JavaScript 时,验证就不仅仅是视觉上的了。表格将不会提交。该功能已融入兼容 HTML5 表单的浏览器中。

    “如果我的判断是正确的,我为什么要使用 HTML 来做一些我可以(而且我必须)用 JS 做的事情?也许 JS 有办法知道一切正常继续,无需执行任何进一步检查。”

    同样,仅使用 HTML 标记将为您提供各种验证器(必需、模式、数字等),并且它们可以直接使用。但是,您将无法控制验证消息的内容或显示它们的确切时间和位置(甚至它们的外观)。这完全取决于浏览器。这就是为什么 HTML5 表单规范包含一个非常强大的 API(通过 JavaScript)对应物 - 让您可以完全控制验证和通知过程。

    var btn = document.getElementById("btnSubmit");
    var frm = document.getElementById("frmTest");
    
    
    btn.addEventListener("click", function(){
      // The HTML 5 Forms API provides a .checkValidity()
      // method to your form object so that you can know
      // if the form is valid or not:
      if(frm.checkValidity()){
        frmTest.submit();
      }
    });
    <form method=post action="http://www.somewhere.com" id=frmTest>
      
      <input required>
      <input type=button id=btnSubmit value=submit>
      
    </form>

    这是一个基本的 JavaScript 函数,它演示了使用 HTML5 表单 API 可以完成的工作:

      // Custom form validation logic:
      function validate(evt) {
    
        // An HTML5 form has a checkValidity() method which forces it
        // to examine the validity of all controls that know how to validate
        // and it returns a boolean indicating if ALL these controls are valid
        // or if any ONE of them is not.
        var valid = theForm.checkValidity();
        if (valid) {
          // Everything is good. Submit the form:
          theForm.submit();
        } else {
          // At least one form element is invalid. Loop through all the elements to
          // see which one(s) they are:
          var theElements = theForm.elements;
    
          for (var i = 0; i < theElements.length; i++) {
            var theElement = theElements[i];
    
            // If the form element participates in the HTML5 Validity Framework and
            // if it is invalid...
            if (theElement.willValidate && !theElement.validity.valid) {
    
              console.warn(theElement.id + " validity details: ");
    
              // ...The object will have a validity object property:
              console.log(theElement.validity);
    
              // The element is invalid. Loop through all the validity object's
              // properties to see why it is invalid:
              for (var constraint in theElement.validity) {
    
                // Check the particular validity constraint for true
                if (theElement.validity[constraint]) {
                  // Update the span element next to the offending form element with the reason:
                  theElement.nextElementSibling.innerHTML = constraint;
                }  // End If
    
              }  // End For
    
            }  // End If
    
          } // End For
    
        } // End If
    
      }  // End Function
    

    【讨论】:

    • @Alexander Taran 请不要编辑某人的答案,以免它说的与作者写的完全不同。
    • 您应该真正处理表单提交,而不是单击处理程序。有其他提交表单的方法,例如在输入字段上简单地按 Enter。
    • @Brad 您会注意到该按钮不是提交按钮,因此单击事件是正确的方法。如果您打算通过 JavaScript 提交,则不应使用提交按钮,因为这样您将不得不取消事件并冒泡。
    • 谁反对所有这些答案?这个和我的似乎都是有效的答案。
    • 我打赌你不使用它,它只是用于代码预览,但无论如何你可能应该考虑不使用“// End For”等。正确的制表符缩进就足够了,像这样你可以教别人坏代码习惯。
    【解决方案4】:

    当 HTML5 验证未通过时,浏览器不应让用户提交表单。 HTML5 提供了很好的验证,但是如果你想要更复杂的验证,或者如果你想针对不支持 HTML5 验证的浏览器,那么使用 js。

    【讨论】:

    • HTML5 提供了非常强大的验证 API。
    • @Scott Marcus 好的,我知道,已修复,我只是想指出,对于更复杂的验证,他应该使用 js。
    • 您的措辞听起来像是在使用 JavaScript 意味着您不再使用 HTML5,但事实并非如此。 HTML5 不仅仅是标记 - 它包含许多 JavaScript API。
    【解决方案5】:

    您可以阻止提交时的默认行为(包括html5的表单验证)并通过js启动此验证以处理数据。

    【讨论】:

      【解决方案6】:

      这是一个示例,您可以使用 HTML5 表单验证来验证要求输入名称的输入字段:

      <input id="name" name="name" value="" aria-describedby="name-format" required aria-required=”true” pattern="[A-Za-z-0-9]+\s[A-Za-z-'0-9]+" title="firstname lastname">
      

      您希望“姓名”字段以“名字姓氏”格式提交,并且只包含字母和空格。您可以通过向“名称”字段添加模式属性来实现此目的,将其值设置为我们希望与数据进行比较的正则表达式。

      使用pattern属性时,正则表达式开头和结尾的^和$是隐含的,不需要包含。

      您可以通过包含标题属性来帮助用户,告诉他们您需要的格式。

      为确保您的用户在电子邮件、网站和票数字段中输入正确的数据,您可以使用 HTML5 中添加的一些新输入类型:

      <input type="email" id="email" name="email" required>
      …
      <input type="url" id="url" name="url">
      …
      <input type="number" id="numTickets" name="numTickets" required>
      

      通过指定适当的类型,您的浏览器将为您验证数据,并确保您在电子邮件字段中有一个电子邮件地址,在网站字段中有一个 URL,在票数字段中有一个数字。

      【讨论】:

      • @Scott Marcus 我发现您的回答非常有用,但我不理解否决票(我投了票)。我相信 'frm.checkValidity()' 是我正在寻找的。可能由于我的英语,我没有清楚地解释我的疑问。我没有以通常的方式“发布”表格;内容由 JS 收集,详细说明,然后发送到 PHP 邮件程序。出于这个原因,我让 HTML 来执行验证,只有当一切正常时,JS 才会控制第二阶段。您的解决方案似乎很完美
      • 好的,很高兴您发现它很有用。有时我觉得这个在stackoverflow中投票和否决答案的游戏非常幼稚!它让每个人都互相反对。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多