停止然后在ajax检查后重启submit()

我最近问了一个问题,这只是没有给我答案。 这就是我想要做的事情,你可以看到我第一次尝试上面的链接:

  1. 用户提交表单
  2. 停止默认提交操作
  3. 检查数据库中是否存在类似的条目
    1. 如果是 ,则显示一条通知,询问他们是否要提交,并提供让他们提交的选项(启用默认操作并提交)。
    2. 如果没有 ,请在表单上启用默认操作并让其提交

我很茫然。 任何帮助表示赞赏。 谢谢帮派。

编辑Simeon :这是我用你的解决方案的代码:

var forceSubmitForm = false; $('#purchaser_contact').submit(function(){ if(forceSubmitForm) return true; if( $("#id").val()=="" ){ if( $("#fname").val()=='' || $("#city").val()=='' ){ alert('First Name and City are required fields. Please fill these in before continuing.'); return false; } $.ajax({ type: "POST", url: 'ajax/contactSearch.php', data: ({ fname: $("#fname").val(), lname: $("#lname").val(), city: $("#city").val(), state: $("#state").val() }), success: function(d) { var obj = JSON.parse( d ); if(obj.result != 0){ $("#contactSearch").remove(); $("#button-wrapper").before('
'+obj.result+'
'); $("#contactSearch").slideToggle('slow'); } else { forceSubmitForm = true; $('#purchaser_contact').submit(); // Form will submit } } }); return false; } //END IF empty id });

在第二次按下提交按钮之前,这将无法工作(即$('#purchaser_contact').submit();不提交表单)。

编辑这从来没有对我有用,但Simeon的答案是最接近的,他声称它适用于所有主流浏览器,所以如果它对某人有帮助,那就太好了。

这是您正在寻找的解决方案。

 var forceSubmitForm = false; $('#myForm').submit(function(){ if(forceSubmitForm) return true; $.ajax({ // ... success: function(data){ if(data.entry != 'OK'){ // or whatever check forceSubmitForm = true; $('#myForm').submit(); // Form will submit }else{ // Form will not be submitted } } }); return false; }); 

编辑为了certificate这种方法有效,我刚刚创建了一个带有表单和提交按钮的示例页面。 这适用于所有主流浏览器:

 $(function(){ // On DOM ready var forceSubmitForm = false; $('#purchaser_contact').live('submit', function() { if (forceSubmitForm){ alert('submitting'); return true; } // A callback function works in the same manner as a timeout setTimeout(function(){ forceSubmitForm = true; $('#purchaser_contact').submit(); }, 1500); // Submit after 1,5 seconds return false; // Do not submit immediately }); }); 

这是jQuery示例(未经测试):

 $(function() { $("#myForm").submit(function() { $.post(/* make AJAX request */ function() { if (/* similar entry does not exisits */) { $("#myForm").data("allow-submit", true).submit(); } else { alert('NOT ALLOWED!'); } }); return $(this).data("allow-submit") || false; // prevent form submit if not allowed }); }); 

基本上,您希望在提交表单时运行函数,然后在函数为负数时短路表单操作。 这样的事应该做​​:

 $("form#myForm").submit(function(){ if(someCustomFunction()){//do the check event.preventDefault; //short circuit someOtherCustomFunction();//display your alternative } }); 

您可以通过向submit事件添加回调函数来处理表单。 如果要停止提交,可以在事件上使用preventDefault()或返回false。

 $('form').submit(function(event) { event.preventDefault(); //do stuff, you can put your ajax call here ... if(fail) { return false; } else { return true; } }); 

这让我疯狂,没有任何解决方案可行,它要么不提交表格,要么进入提交表格的无限循环。 所以我只是将提交按钮变成了常规按钮。 然后在ajax循环中提交表单。 这意味着您不必担心停止提交按钮的默认操作,因为它只是一个常规按钮。

 

和Javascript / jQuery:

 $("#btnDoSomething").click(function() { var request = $.ajax({ data: {username: $("#username").val()}, dataType: 'json', success: function(data) { // when response is returned do stuff then submit form // ... $("#loginForm").submit(); }, url: 'ajax-check-username.php' }); }); 

此外,如果用户按Enter键你想要做ajax请求然后提交,所以这段代码也很方便:

 // If they hit the enter button, run the same method $('#loginForm').bind('keypress', function(e) { if (e.keyCode == 13) { $(this).find("#btnDoSomething").click(); } }); 

完美的工作!

我知道我正在犯一个旧线程,但我最近遇到了这个问题,并且认为我会在其他任何偶然发现这个问题的人身上给出答案。 我的解决方案是使$.ajax调用同步。

这对我有用:

 var formShouldSubmit = false; $("form#my_form").bind("submit", function(){ $.ajax({ url: "my_form_validate.php", data: $(this).serialize(), success: function(data){ if ( data.valid ){ formShouldSubmit = true; } else{ $("#error").html('Invalid entry'); } }, async: false, dataType: "json" }); if ( !formShouldSubmit ){ return false; } });