Javascript 表单在onsubmit函数完成之前提交

Javascript 表单在onsubmit函数完成之前提交,javascript,jquery,Javascript,Jquery,我正在调用JavaScript函数onsubmit of form,但表单在完成提交函数之前已提交。如果我在onsubmit函数中使用警报,它将首先完成函数,然后提交表单。我使用settimeout函数代替警报,但它不起作用。在onsubmit完成后,我如何提交表单 function chat1close(name){ var abc; abc=window.frames[0].test(); $.ajax({ type:'GET', ur

我正在调用JavaScript函数onsubmit of form,但表单在完成提交函数之前已提交。如果我在onsubmit函数中使用警报,它将首先完成函数,然后提交表单。我使用settimeout函数代替警报,但它不起作用。在onsubmit完成后,我如何提交表单

function chat1close(name){
    var abc;
    abc=window.frames[0].test();
    $.ajax({
        type:'GET',
        url:'modules/closechat.php?abc='+abc+'&name='+name,
        success:function(data){

        }
    });
    document.getElementById("hello").innerHTML=" ";
    alert("yes");
    return true;
}

async:false
添加到ajax调用中。这将阻止它执行函数的其余部分,直到调用返回。

向ajax调用添加
async:false
。这将阻止它执行函数的其余部分,直到调用返回。

如果
chat1close
是表单submit上正在执行的函数,并且您希望同步执行
代码,则在
.ajax
请求上设置以下选项:

async:false,

如果
chat1close
是表单提交上正在执行的函数,并且您希望同步执行
代码,则在
.ajax
请求上设置以下选项:

async:false,

在函数完成之前不会发送表单,但您正在函数中进行异步AJAX调用,表单在AJAX响应到达和调用成功回调函数之前发送

发送表单之前执行AJAX调用的唯一方法是使用同步AJAX调用,但这将在浏览器等待响应时冻结浏览器:

function chat1close(name){
  var abc = window.frames[0].test();
  $.ajax({
    type: 'GET',
    async: false,
    url: 'modules/closechat.php?abc='+abc+'&name='+name,
    success:function(data){
      document.getElementById("hello").innerHTML=" ";
      alert("yes");
    }
  });
  return true;
}
但是,您可以停止发送表单,而是在AJAX响应到达后发送表单:

function chat1close(name){
  var abc = window.frames[0].test();
  $.ajax({
    type: 'GET',
    async: false,
    url: 'modules/closechat.php?abc='+abc+'&name='+name,
    success:function(data){
      document.getElementById("hello").innerHTML=" ";
      alert("yes");
      $('#IdOfTheForm')[0].submit();
    }
  });
  return false;
}

在函数完成之前不会发送表单,但是您正在函数中进行异步AJAX调用,表单在AJAX响应到达和调用成功回调函数之前发送

发送表单之前执行AJAX调用的唯一方法是使用同步AJAX调用,但这将在浏览器等待响应时冻结浏览器:

function chat1close(name){
  var abc = window.frames[0].test();
  $.ajax({
    type: 'GET',
    async: false,
    url: 'modules/closechat.php?abc='+abc+'&name='+name,
    success:function(data){
      document.getElementById("hello").innerHTML=" ";
      alert("yes");
    }
  });
  return true;
}
但是,您可以停止发送表单,而是在AJAX响应到达后发送表单:

function chat1close(name){
  var abc = window.frames[0].test();
  $.ajax({
    type: 'GET',
    async: false,
    url: 'modules/closechat.php?abc='+abc+'&name='+name,
    success:function(data){
      document.getElementById("hello").innerHTML=" ";
      alert("yes");
      $('#IdOfTheForm')[0].submit();
    }
  });
  return false;
}
实现这一点的简单方法:

    var $form = jQuery("#the_form");
    var should_submit = false;
    $form.submit(function () {
        if (should_submit)
           return true;

        $.post('some/async/thing', function () {
        //This is an async callback that
        //will set the should submit var to true and resubmit form.
        should_submit = true;
        $form.submit();  //will now submit normally because should_submit is true.
        });
        return false;
    });
实现这一点的简单方法:

    var $form = jQuery("#the_form");
    var should_submit = false;
    $form.submit(function () {
        if (should_submit)
           return true;

        $.post('some/async/thing', function () {
        //This is an async callback that
        //will set the should submit var to true and resubmit form.
        should_submit = true;
        $form.submit();  //will now submit normally because should_submit is true.
        });
        return false;
    });


如果您使用的是AJAX,您应该阻止表单的本机提交操作。您能提供更多的代码吗,比如您的提交处理程序被绑定到哪里?详细说明@Diodeus注释:您的
onsubmit
处理程序应该
返回false或用于取消“正常”表单提交。但是,如果没有看到完整的
onsubmit
处理程序,我们将无法提供进一步的帮助。如果您使用AJAX,您应该阻止表单的本机提交操作。您能否提供更多的代码,例如提交处理程序的绑定位置?要详细说明@Diodeus注释:您的
onsubmit
处理程序应该
返回false或用于取消“正常”表单提交。但是,如果不查看完整的
onsubmit
处理程序,我们将无法进一步提供帮助。不,不要添加
async:false
!这会使屏幕冻结。@gdoron AFAIK,没有别的办法了。AJAX是异步的,因此请求被发送,其余的请求在执行
$.post()
之后执行。@gdoron如果AJAX需要在表单提交之前执行,他可以在调用中添加async:false,或者从初始函数返回false并提交表单(就此而言,执行此功能的任何其他部分)来自ajax成功处理程序。@JamWaffles-它将与
async:true
一起工作:提交处理程序应返回false以防止默认表单提交,然后ajax成功函数应提交。@要解决此问题,请使用1178695,请参阅Guffa详细且解释更好的答案。不,不要添加
async:false
!它将冻结scre恩。@gdoron AFAIK,没有其他方法可以做到这一点。AJAX是异步的,因此会发送请求,其余的请求都是在执行
$.post()
之后执行的。@gdoron如果在提交表单之前需要执行AJAX,他可以在调用中添加async:false,或者从初始函数返回false并提交表单(就此而言,执行此功能的任何其他部分)来自ajax成功处理程序。@JamWaffles-它将使用
async:true
:提交处理程序应返回false以防止默认表单提交,然后ajax成功函数应提交。@user1178695要解决此问题,请参阅Guffa的详细解释答案。除了调用.submit()之外,这基本上是正确的再次返回false。请参阅下面的示例,了解如何解决此问题。@RaySuelzer:好的,我没有想到这一点。jQuery
submit
方法很棘手,因为它会触发
submit
事件,而DOM
submit
方法不会。简单的解决方法是使用DOM方法:
$(“#IdOfTheForm”)[0].submit();
。除了调用.submit()之外,这基本上是正确的再次返回false。请参阅下面的示例,了解如何解决此问题。@RaySuelzer:好的,我没有想到这一点。jQuery
submit
方法很棘手,因为它会触发
submit
事件,而DOM
submit
方法不会。简单的解决方法是使用DOM方法:
$(“#IdOfTheForm”)[0]。提交();