Javascript 如何提交已被event.preventDefault()截获的表单
我有一个简单的表单,id=“edit\u profile” 提交表单时,我想截取它并检查是否需要通过谷歌地图api对地址进行地理编码,如果不需要,请继续提交 比如: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
$('#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。