2013-05-07 35 views
3

是否可以停止表单提交,然后从ajax调用成功内部重新提交相同表单?jQuery - 在ajax调用后恢复表单提交

目前它获得成功位,但它不会重新提交应提交并将用户重定向到http://example.com网站的表单。

非常感谢您的帮助提前

如果这是不可能做这种方式,有没有得到它的工作的另一种方式?

$(document).ready(function() { 
    $('form').submit(function(e) { 
     e.preventDefault(); 

     $.ajax({ 
      url: $('form').attr('action'), 
      type: 'post', 
      data: $('form').serialize(), 
      success: function(data) { 
       if (data == 'true') 
       { 
        $('form').attr('action', 'http://example.com'); 
        $('form').unbind('submit').submit(); // mistake: changed $(this) to $('form') - Problem still persists though it does not resubmit and redirect to http://example.com 
       } 
       else 
       { 
        alert('Your username/password are incorrect'); 
       } 
      }, 
      error: function() { 
       alert('There has been an error, please alert us immediately'); 
      } 
     }); 
    }); 
}); 

编辑:

帖子#1签出了下面的代码:

我只是觉得我有口难言也三编辑这段代码无济于事。

var ajaxSent = false; 
$(document).ready(function() { 
    $('form').submit(function(e) { 

     if (!ajaxSent) 
      e.preventDefault(); 

     $.ajax({ 
      url: $('form').attr('action'), 
      type: 'post', 
      data: $('form').serialize(), 
      success: function(data) { 
       if (data == 'true') 
       { 
        alert('submit form'); 
        ajaxSent = true; 
        $('form').attr('action', 'http://example.com'); 
        $('form').submit(); 
        return true; 
       } 
       else 
       { 
        alert('Your username/password are incorrect'); 
        return false; 
       } 
      }, 
      error: function() { 
       alert('There has been an error, please alert us immediately'); 
       return false; 
      } 
     }); 
    }); 
}); 

我也试过这段代码,没有任何运气。

$(document).ready(function() { 
    $('form').submit(function(e) { 
     e.preventDefault(); 

     $.ajax({ 
      url: $('form').attr('action'), 
      type: 'post', 
      data: $('form').serialize(), 
      success: function(data) { 
       if (data == 'true') 
       { 
        $('form').attr('action', 'http://example.com'); 
        $('form').unbind('submit').submit(); 
        return true; 
       } 
       else 
       { 
        alert('Your username/password are incorrect'); 
        return false; 
       } 
      }, 
      error: function() { 
       alert('There has been an error, please alert us immediately'); 
       return false; 
      } 
     }); 
    }); 
}); 
+0

这将最有可能提交表单无限。起初,阿贾克斯提交表格,在成功时,它再次通过相同的阿贾克斯,并再次成功......然后再次......然后再次。 – SachinGutte 2013-05-07 09:39:51

+0

@SachinG为什么?他们在第二次提交表单之前删除(以及试图删除)'submit'事件处理程序。 – 2013-05-07 09:40:39

+0

@AnthonyGrist但解绑后,相同的处理程序被调用,因为提交后面是它。不是吗?或者我错了? – SachinGutte 2013-05-07 09:42:38

回答

10

解决方案非常简单,涉及在.ajax()中添加和设置async to false。另外,我已经重新编写了代码来处理提交按钮,而不是在AJAX成功通过时提交表单。

这是我工作的代码:

$(document).ready(function() { 
    var testing = false; 
    $('#btn-login').on('click', function() { 
     $.ajax({ 
      url: $('form').attr('action'), 
      type: 'post', 
      data: $('form').serialize(), 
      async: false, 
      success: function(data) { 
       if (data == 'true') 
       { 
        testing = true; 
        $('form').attr('action', 'https://example.com'); 
        $('form').submit(); 
       } 
       else 
       { 
        alert('Your username/password are incorrect'); 
       } 
      }, 
      error: function() { 
       alert('There has been an error, please alert us immediately'); 
      } 
     }); 

     return testing; 
    }); 
}); 
+1

当你输入任何输入时会发生什么?它会提交这个逻辑。 – 2017-01-05 16:26:08

+0

@RubenArevalo在填写所有字段之前禁用回车键?为什么你会允许某人提交表格,如果它没有所有必要的数据呢? – adamj 2017-01-05 23:05:49

3

在一行中使用$('form')选择的形式来改变其行为,但你使用$(this)要尽量选择相同的形式。我猜想回调函数内部的this与您期望的不同,并且不是您的表单(可能是window对象)。

刚刚链中的呼叫:

$('form').attr('action', 'http://example.com').unbind('submit').submit(); 
+0

$(本)实际上应该是$(“形式”),这是我已经纠正了码忘了编辑的计算器后我张贴前一个错误。 Do'h。关于链接,是啊,我知道我可以做到这一切一气呵成,我只是喜欢单独做是为了更好地了解 – adamj 2013-05-07 09:50:17

+0

@adamj老实说,代码看起来正确的我与变化。你可能不得不调试它,看看什么东西被由AJAX请求返回,看到部分代码是射击等 – 2013-05-07 09:53:20

+0

AJAX是好的没有问题存在。当它首次运行.submit()时,它会触发AJAX,它会取回数据并取得成功。它应该然后.unbind()表单提交并重新提交表单,但重新提交从未发生。默认情况下,您会立即知道它是否通过提交可导致http://example.com的表单来工作,但这种情况不会发生。 – adamj 2013-05-07 10:04:35

6

这是重新选择整个代码的所有形式的标签没有很好的做法,如果你有在页面上多形式? 另外你最好还是用jQuery使用.on().off()

$(document).ready(function() { 
    $('form').on('submit', function(e) { 
     e.preventDefault(); 

     // cache the current form so you make sure to only have data from this one 
     var form = this, 
      $form = $(form); 

     $.ajax({ 
      url: form.action, 
      type: form.method, 
      data: $form.serialize(), 
      success: function(data) { 
       if (data == 'true') 
       { 
        $form.attr('action', 'http://example.com').off('submit').submit(); 
       } 
       else 
       { 
        alert('Your username/password are incorrect'); 
       } 
      }, 
      error: function() { 
       alert('There has been an error, please alert us immediately'); 
      } 
     }); 
    }); 
}); 
+0

我会给.on()一个镜头,看看是否有帮助。关于不使用表单标签,你是对的,但在这种情况下,页面上总是只有单一表单。如果是其他情况,我会在表单上打一个ID属性并将其作为目标。 – adamj 2013-05-07 10:08:49

+0

即使添加ID,我仍然会缓存对象,只是为了提高性能和代码一致性。 – Simon 2013-05-07 11:25:41