You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS循环绑定表单提交处理器报错:Uncaught TypeError 如何修复?

表单提交JS代码错误修复方案

错误核心原因:给表单onsubmit事件赋值时,错误地直接执行了handleSubmit函数,而非绑定函数引用。

你的代码中forms[i].onsubmit = handleSubmit(event);这一行,会在页面加载的循环过程中立即调用handleSubmit,此时没有真实的表单提交事件触发,event参数为undefined,因此触发Cannot read properties of undefined (reading 'preventDefault')错误。

修复方案

方案1:修正原有事件赋值方式

只需去掉函数调用的括号和event参数,将函数本身赋值给onsubmit:

(function() {
  var handleSubmit = function (event) {
    event.preventDefault();
  
    var myForm = event.target;
    var formData = new FormData(myForm);
    
    fetch("/", {
      method: "POST",
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      body: new URLSearchParams(formData).toString(),
    })
      .then(() => console.log("Form successfully submitted"))
      .catch((error) => alert(error));
  };
  
  var forms = document.getElementsByTagName('form');
  
  for(var i = 0; i < forms.length; i++) {
    // 仅传递函数引用,不立即执行
    forms[i].onsubmit = handleSubmit;
  }
})();

方案2:推荐使用addEventListener绑定事件

这种方式更灵活,支持为同一个事件绑定多个处理函数:

(function() {
  var handleSubmit = function (event) {
    event.preventDefault();
  
    var myForm = event.target;
    var formData = new FormData(myForm);
    
    fetch("/", {
      method: "POST",
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      body: new URLSearchParams(formData).toString(),
    })
      .then(() => console.log("Form successfully submitted"))
      .catch((error) => alert(error));
  };
  
  var forms = document.getElementsByTagName('form');
  
  for(var i = 0; i < forms.length; i++) {
    forms[i].addEventListener('submit', handleSubmit);
  }
})();

额外说明

你代码中用FormData配合application/x-www-form-urlencoded类型,通过new URLSearchParams(formData).toString()处理请求体的逻辑是正确的,无需修改。

内容的提问来源于stack exchange,提问作者Oleksii Binetskyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:07:15