Ajax 请求后,以正常方式提交表单


Ajax after ajax request, submit form normal way

我有 ajax 请求:

<script>
        $("#abc_form_submit").click(function(e) {
        e.preventDefault();
        //........
        $.ajax({
               type: "POST",
               url: url,
               dataType: 'json',
               data: $("#abc_form").serialize(), // serializes the form's elements.
               success: function(data)
               {
                    if(data.success == 'false') {
// show errors
                    } else {
                        // SUBMIT NORMAL WAY. $("#abc_from").submit() doesnt work.
                    }
               }
             });
        return false; // avoid to execute the actual submit of the form.
    });
    </script>

和 php

.....
return $this->paypalController(params, etc...) // which should redirect to other page
.....

如果成功,我应该如何发出 ajax 请求,以正常方式提交表单,因为现在如果我重定向(在 PHP)它唯一的返回响应,但我需要这个 ajax 请求将 php 代码作为正常表单提交处理(如果成功)

请不要建议"窗口位置"。

我会在表单中添加一个类来测试你的 ajax 是否已经发生。 如果它只是使用正常的点击功能。

像这样:

$('form .submit').click(function(e) {
  if (!$('form').hasClass('validated'))
  {
    e.preventDefault();
    //Your code here
    $.post(url, values, function(data) {
        if (success)
        {
          $('form').addClass('validated');
          $('form .submit').click();
        }
    });
  }
}

为什么不使用在成功的 AJAX 请求后更新的结果变量?

<script>
    $("#abc_form_submit").click(function(e) {
    e.preventDefault();
    // avoid to execute the actual submit of the form if not succeded
    var result = false;
    //........
    $.ajax({
           type: "POST",
           url: url,
           dataType: 'json',
           async: false,
           data: $("#abc_form").serialize(), // serializes the form's elements.
           success: function(data)
           {
                if(data.success == 'false') {
                    // show errors
                } else {
                    // SUBMIT NORMAL WAY. $("#abc_from").submit() doesnt work.
                    result = true;
                }
           }
         });
    return result; 
});
</script>

我之前遇到过这个问题,我需要将表单提交到两个地方,一个用于跟踪,另一个用于实际表单操作。

只能通过编程方式提交它来工作,当你把form.submit()放在setTimeout后面。 500ms似乎已经为我解决了问题。 我不确定为什么浏览器在尝试以传统方式提交表单时无法以编程方式提交表单,但这似乎可以解决问题。

setTimeout(function(){ $("#abc_from").submit(); }, 500);

有一件事要记住,尽管一旦提交,那就是页面,它就消失了。 如果您仍希望页面上正在运行的任何进程,则需要将表单的目标设置为 _blank,以便它将在新选项卡中提交。