javascript - 为什么表单的 onsubmit 函数只调用一次?

标签 javascript html forms dom-events

和 jar 头上写的差不多。此代码片段演示了该问题:

function check(e) {
  console.log($('input[name="myinput"]').val());
  if ($('input[name="myinput"]').val() == "123") {
    return true;
  } else {
    $('input[name="myinput"]')[0].setCustomValidity("Invalid");
    return false;
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <form onsubmit="return check()">
    <input name="myinput">
    <input type="submit">
  </form>
</div>

加载表单后,在输入字段中输入 1 并提交表单。提交失败,因为输入字段的值不是 123,并且值 "1" 记录在控制台中。现在将值更改为其他值并重新提交表单;控制台中没有多余的行,即使输入的值为 123,“无效”表单有效性仍然存在。

为什么 onsubmit 处理程序只调用一次?

最佳答案

因为处于“无效”状态的表单(因为表单内的输入处于“无效”状态)将不会提交。

创建的表单有效性不会在 submit 事件上更改,因为正如您所注意到的,您不会获得任何新的 submit。您必须在提交之前更改表格的有效性。通常,会对每个输入单独检查表单有效性。从这里开始就是你自己的口味了。我建议检查 blur 上每个输入的有效性:

$('input[name="myinput"]').on("blur", () => {
    // Do your checks and setCustomValidity depending on if is valid or not
});

这样,如果所有输入都有效,您只会收到 submit 事件。顺便说一下,要使其工作,您必须在启动时将所有输入设置为无效状态,以避免在不触及任何输入的情况下提交空内容。

如果所有输入均为空,另一种方法可能是禁用提交按钮。为此,您还需要 JavaScript 并检查所有输入上的 changeinput 事件。

关于javascript - 为什么表单的 onsubmit 函数只调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58678973/

相关文章:

javascript - 取消选择单选选项

html - 将两个谷歌地图框架彼此相邻定位

javascript - 文件输入时动态启动事件

javascript - 如何找到父节点并删除子节点

javascript - 将 SVG 转换为 PDF javascript mermaid.js 示例时出现奇怪的输出

javascript - 如何在提交时从 React-Bootstrap 表单中获取值?

javascript - 无法解析 JSON 字符串属性中存在的 XML

php - 从 View 中的公用文件夹调用 CSS。拉维尔 5.3

html - 如何在我的案例中显示 ul 元素?

jquery - 出现 "Object #<NodeList> has no method ' click'"错误?