【问题标题】:How to show native validation error for specific input on change event?如何为更改事件的特定输入显示本机验证错误?
【发布时间】:2026-02-09 15:15:02
【问题描述】:

我有一个经典的 HTML5 表单。当用户更改特定输入值时,我想使用 jquery/javscript 显示浏览器本机错误工具提示。我想避免用户尝试提交表单以查看所有错误。

为此,我尝试了 checkValidity()reportValidity() 函数,但只有在我的情况下添加 alert('test'); 时它才有效......太奇怪了

JS 脚本

myInputJqueryObject.on('change', function() {
   if ( !this.checkValidity() ) {
       this.setCustomValidity( 'Custom error !!!' );
       var $form = $('#my-form');
       if( $form[0].checkValidity() === false) {
           $form[0].reportValidity();
           //alert('test'); <-- works only if I active this line code
           return true;
       }
   }
});

【问题讨论】:

    标签: javascript jquery html validation


    【解决方案1】:

    当您知道输入无效时,您无需检查表单有效性。您可以省略if( $form[0].checkValidity() === false)。您也可以在输入本身上reportValidity
    setCustomValidity 需要一些时间才能应用于输入字段。所以你必须将reportValidity 包装成setTimeout

    $('input').on('change', function() {
      var self = this;
      if (!self.checkValidity()) {
        self.setCustomValidity('Custom error !!!');
        setTimeout(function() {
          self.reportValidity();
          self.setCustomValidity('');
        }, 1);
      }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <form id="my-form"><input value="del me" required></form>

    【讨论】:

    • 在您的示例中,只有一个问题。当你清理输入时,错误信息会正确显示,但如果你再次写入文本,错误信息会再次显示。
    • self.checkValidity() 总是 false
    【解决方案2】:

    根据“Kosh Very”的回答,我找到了解决方案。听起来不错,没有错误。

    JS 脚本:

     $('input').on('focusout', function() {
       var self = this;
       var validity = self.checkValidity();
       if( !validity ){
          if( self.validity.patternMismatch ){ //<-- Optionnal : Condition to keep others native message errors except Pattern. 
              self.setCustomValidity( 'Custom Error about pattern!!!' );
          }
          setTimeout(function() {
                self.reportValidity();
                self.setCustomValidity( '' ); //<-- Important to reinit
          }, 1);
       }
     });
    

    【讨论】:

    • 为您的努力+1!但是只有当validity.patternMismatch 为真时,您的解决方案才有效。在某些情况下,它可能是错误的。
    • 我测试了 1) 当我清理输入时,会显示关于 'required' 的消息错误。 2)当我插入错误的模式时,我的自定义消息有效。 3)当我插入正确的模式时,不再出现消息错误。
    • 在我的示例中,我只想为 patternMismatch 自定义消息,并为其他情况保留本机消息错误,这听起来不错。
    • 您在问题中显示的问题是why it does not work without alert。与模式验证和其他特定条件无关。无论如何,它可以随心所欲地工作真是太好了!
    • 嗯,好的。我现在明白你为什么这么说。谢谢!