Jquery 绕过.submit()处理程序
我有一个表单提交的事件处理程序,需要做一些工作。这项工作包括调用ajax来执行一些非常具体的验证。由于异步性质,我的意图是在事件处理程序的顶部Jquery 绕过.submit()处理程序,jquery,Jquery,我有一个表单提交的事件处理程序,需要做一些工作。这项工作包括调用ajax来执行一些非常具体的验证。由于异步性质,我的意图是在事件处理程序的顶部preventDefault,如果一切顺利,通过触发submit()方法“手动”提交表单 当然,这让我陷入了一个循环。如果我提交并且一切顺利,那么在我重新提交时将调用提交事件处理程序。当我手动触发submit时,有没有办法绕过处理程序 我要补充的是,我的极客业力今天是空的,所以我可能会使这比它必须要困难得多。如果有一个非常简单的解决方案,我想听听 我应该补
preventDefault
,如果一切顺利,通过触发submit()
方法“手动”提交表单
当然,这让我陷入了一个循环。如果我提交并且一切顺利,那么在我重新提交时将调用提交事件处理程序。当我手动触发submit时,有没有办法绕过处理程序
我要补充的是,我的极客业力今天是空的,所以我可能会使这比它必须要困难得多。如果有一个非常简单的解决方案,我想听听
我应该补充一点,通过简单地使jQuery$.ajax
调用同步,我已经制定了一个可行的解决方案,但我不禁觉得有一种更有效的方法可以完成这项工作,而我今天还没有看到
谢谢。不要在表单上放置提交按钮,请将一个按钮绑定为“验证”机制(正确时)最终提交
就向后兼容性而言,添加一个submit按钮,然后使用jQuery将该按钮替换为一个自定义绑定按钮(因此,如果它们不支持javascript,它们仍然可以继续)。毕竟,对于这些情况/表单的黑客攻击,服务器应该有输入验证
重新考虑之后,移动验证逻辑的触发器。绑定到submit按钮的click事件。这允许您在调用submit()
之前进行干预。此事件还应始终返回false,因为您希望等待AJAX响应以真正验证表单是否应提交
在那里,等待AJAX的响应,一切正常后调用submit
关于向后兼容性,在以下情况下,您仍应在服务器端使用此验证逻辑:
函数myFunct(){
$.post('ajax/test.html',函数(数据){
//对ajax响应进行验证
如果(一切都好){
$('#myForm')。提交();
}
});
}
您要做的是“解锁”该功能
var done = false;
function AjaxCallback()
{
done = true;
document.getElementById("myForm").submit();
}
function PerformAjax()
{
if (!done)
{
// perform ajax here
return false;
}
else
return true;
}
<form id="myForm" onsubmit="javascript: return PerformAjax();">
var done=false;
函数AjaxCallback()
{
完成=正确;
document.getElementById(“myForm”).submit();
}
函数PerformAjax()
{
如果(!完成)
{
//在这里执行ajax
返回false;
}
其他的
返回true;
}
您可以执行以下操作:
HTML:
<form id="my-form">
<!-- your fields... -->
<button type="submit">Submit</button>
</form>
var myForm = $('#my-form');
myForm.on('submit', function(e, skipValidation) {
if(skipValidation) {
return;
}
yourAjaxValidation().then(function(){
myForm.trigger('submit', [true]);
})
})
鉴于AJAX是异步的,在“提交线程”中不可能出现简单的“是/否”。这就是全部问题。提交表单时,它不会调用函数。重新阅读代码。我正在使用onclick事件,而不是onsubmit。。。编辑:有人删除了他们的评论。你仍然认为返回可以从AJAX“成功线程”返回到原始表单“提交捕获线程”。你也有一个无限循环,基本上模仿OP的暗示。什么?表单将在第一次提交时执行ajax,返回false-它不会提交。当ajax完成时,它会将
done
设置为true,然后再次提交表单。这次表单将成功提交,因为done
为true,而PerformAjax
将返回true。事实上,我没有看到done在任何地方设置为true(尽管我现在意识到它是在AJAX调用中设置的。我的错误。虽然我可以在AJAX调用中按ESC键,但可以操作表单,然后重新提交并绕过“锁".Hmm true,或者甚至javascript:done=true;void 0;
进入URL栏也会被忽略。我更喜欢上面的解决方案。我们正在考虑相同的解决方案+1您知道,点击事件是否会捕获按下Enter
键?我想确定我捕获了提交表单的所有方法。@Rob:应该,思想测试是最好的方法。可以在各种浏览器中弹出JSFIDLE演示,然后尝试按enter键。--后续:最新的chrome、FF6、IE9都会在输入字段中触发enter键的单击事件。
var myForm = $('#my-form');
myForm.on('submit', function(e, skipValidation) {
if(skipValidation) {
return;
}
yourAjaxValidation().then(function(){
myForm.trigger('submit', [true]);
})
})