Javascript 如何提交已被event.preventDefault()截获的表单

Javascript 如何提交已被event.preventDefault()截获的表单,javascript,jquery,forms,form-submit,preventdefault,Javascript,Jquery,Forms,Form Submit,Preventdefault,我有一个简单的表单,id=“edit\u profile” 提交表单时,我想截取它并检查是否需要通过谷歌地图api对地址进行地理编码,如果不需要,请继续提交 比如: $('#edit_profile').on('submit', function(event) { event.preventDefault(); if ( some test ) { geocode_address( address, this ); // the api callback will

我有一个简单的表单,id=“edit\u profile”

提交表单时,我想截取它并检查是否需要通过谷歌地图api对地址进行地理编码,如果不需要,请继续提交

比如:

$('#edit_profile').on('submit', function(event) {
    event.preventDefault();
    if ( some test ) {
        geocode_address( address, this ); // the api callback will handle form submit
    } else {
    // we want to go ahead and submit the form
    this.submit();
    }
});
问题是
this.submit()
正在抛出错误
TypeError:object#的属性“submit”不是函数

我最近读了一些东西,但现在找不到关于必须使用本机JavaScript而不是jQuery来提交表单的内容(我猜是因为表单提交的jQuery事件处理程序已经被告知使用默认值)


但是如果我尝试一些变体,比如
document.getElementById('edit_profile').submit()
文档。表单[0]。提交()
我得到了相同的错误或类似的错误。

DOM元素没有方法
。submit
--但是jQuery对象有方法(仅在
表单
元素上)--基本上,您忘记在jQuery中包装
这个

$(this).submit();
参考:

编辑:

我知道“无限循环”场景是从哪里来的。实际上,您应该将处理程序设置为在单击Submit
按钮时触发,而不是表单实际提交


现在,您可以捕获表单
submit
操作并阻止默认操作(即提交)——然后执行一些操作并在
this
上调用
submit
。这将触发表单
submit
的处理程序,从而防止再次执行默认操作!因此,简而言之,在提交按钮上放置一个处理程序,阻止默认操作,执行逻辑,然后调用
$(“#edit_profile”).Submit()

为什么不像这样重新排列代码

$('#edit_profile').on('submit', function(event) {
  if ( some test ) {
    event.preventDefault();
    geocode_address( address, this ); // the api callback will handle form submit
  } else {
    // we want to go ahead and submit the form
    // this.submit(); // no need to call explicitly
  }
});

如果您想在
某些测试中调用
,它将不起作用,但从您的代码中看,它不是这样的。

我回答自己的问题,因为解决方案是如此意外和简单,需要重复。完全感谢Chris Butler回答了这个相关问题:(注意,他的答案不是公认的)

回答:如果您命名&#id您的提交按钮“submit”,它将与本机JavaScript.submit()方法的名称冲突,该方法将不再工作,并给出问题中描述的类型错误

因此,我的解决方案是将我的提交按钮重命名为其他按钮

重述:

要截取表单提交,您可以截取单击提交按钮或截取表单提交本身。如果您的目标是截取表单提交,那么请执行截取操作,而不是“提交”按钮上的“单击”事件,因为表单可以通过其他事件提交,例如在文本字段上按enter键


如果通过jQuery拦截表单,例如,
$(“#myForm”).on(“submit”,function(){…})
,然后将提交处理传递给另一个函数(例如,在调用地理编码api的问题中),那么该函数将需要通过直接作用于DOM表单元素来触发表单提交(例如,`document.getElementById('myForm').submit())它将在不触发onsubmit事件的情况下提交表单,这样就不会再次触发初始截获,从而创建一个无限循环,就像使用jQuery触发提交一样。

真的吗?我经常阅读有关本机javascript表单提交的内容,例如:将“this”包装为jQuery对象将设置一个无限循环。Wra将
this
映射到jQuery对象中并不会设置无限循环,您需要在jQuery中始终使用
$(this)
!但您不需要jQuery使用
this
,您只需要使用
$(this)
如果您想使用jquery操作
。无限循环可能是错误的名称,但在任何情况下,我都无法将其粘贴到此处。使用$(此)意思是我正在截取表单提交,然后提交,截取提交,提交,截取提交,提交等等@terraling-我想我们都可能有点困惑,
这是引用您的
表单
元素还是单击的按钮?当您单击su时,您的功能应该正在运行bmit按钮,然后阻止默认操作,然后针对表单调用
submit
——不要阻止表单本身的默认操作。首先,感谢btw在这方面花费的时间。我将尝试拦截单击而不是提交,尽管我要指出jquery docs for submit())使用截取表单提交的示例,而不是单击按钮,因此在这种情况下可能需要它,但我一般不会忽略它。我会回来报告的…谢谢你,阿米塔姆。请注意,在您的示例中,else{}子句实际上是多余的,因为在if测试失败后,在匿名函数的末尾有一个隐式返回true,它将触发submit。