【问题标题】:Why does checkValidity or reportValidity triger automatic submit of a form in jquery?为什么 checkValidity 或 reportValidity 会触发 jquery 中表单的自动提交?
【发布时间】:2021-12-30 13:26:01
【问题描述】:

考虑以下代码:

$("button[type='submit']").click(function(e){ 
  if($(this).closest("form").checkValidity()) {
    $(this).closest("form").reportValidity();
  }   
  e.preventDefault();   
  alert("Never happens!!!");   
});

如果输入数据有效,然后我按下提交按钮,则提交 php 表单,而不会让 e.preventDefault();alert("Never happens!!!"); 执行。我怀疑这是因为checkValidityreportValidity 返回true,它充当return true; 语句。

考虑这段代码:

$("button[type='submit']").click(function(e){         
  e.preventDefault();   
  alert("Does happen!!!");   
});

这次我看到了警报,意思是preventDefault 阻止了表单的提交。即使checkValidityreportValidity返回true,我有什么奇怪的,它们如何充当jquery点击函数的返回语句?

需要注意的是,下面的方法也不起作用:

$("button[type='submit']").click(function(e){ 
  e.preventDefault(); 
  if($(this).closest("form").checkValidity()) {
    $(this).closest("form").reportValidity();
  }          
  alert("Never happens!!!");   
});

我认为preventDefault 阻止checkValidityreportValidity 正常工作并迫使它们返回false,这在某种程度上充当return false; 语句导致alert 不被执行。

另一种可能的解释是调用checkValidityreportValidity 会导致表单被提交。不知道为什么会这样。

请参考官方文档说明。

【问题讨论】:

  • 我猜你的脚本坏了。例如,如果验证插件的脚本加载失败,调用$(this).closest("form").checkValidity() 将导致错误并阻止任何进一步的脚本命令执行。这解释了为什么您永远不会看到警报。您检查浏览器控制台是否有错误消息?
  • @ChrisG Ahhh。比如天真的错误......我应该使用$(this).closest("form")[0]。我没有使用任何插件,而是使用原生 html5 验证 api。

标签: javascript jquery forms validation html5-validation


【解决方案1】:

checkValidity()reportValidity() 不是 jQuery 对象的方法。您需要在底层 form Element 对象上调用它们。

从上下文看来,if 条件中的逻辑需要反转,以便仅在表单为 无效 时调用 reportValidity() - 以及 e.preventDefault()停止实际的表单提交。

$("button[type='submit']").click(function(e) {
  let form = $(this).closest('form').get(0);
  if (!form.checkValidity()) {
    form.reportValidity();
    e.preventDefault();
  }

  console.log("Will always happen");
});
<form>
  <input type="text" name="foo" value="" required />
  <button type="submit">Submit</button>
</form>

话虽如此,当您将required 属性应用于表单中的任何控件时,您的 JS 代码是完全多余的,因为默认情况下您会免费获得这种确切的行为:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <input type="text" name="foo" value="" required />
  <button type="submit">Submit</button>
</form>

【讨论】:

  • 实际上,即使输入正确,我也故意不允许提交,我宁愿展示另一个引导模式以进行进一步的条件检查。我仅在主要输入有效时才显示模态。整个问题只是一个愚蠢的错误。
  • 在这种情况下上面的答案仍然有效,您只需将preventDefault()移到if之外
  • 我不需要同时使用reportValiditycheckValidityform.reportValidity(); 只返回 falsetrue 在当前逻辑中什么都不做。在我的实际代码中,我最终使用了if(!$(this).closest("form")[0].reportValidity()) { $(this).submit(); } ,这样我可以看到浏览器的默认工具提示,后来我使用preventDefault 来确保表单没有通过正确的输入提交。
猜你喜欢
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2016-12-14
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多