如何使用jquery onsubmit发送帖子但仍然发送表单

时间:2011-06-11 19:30:09

标签: javascript jquery forms

我希望在提交表单时触发此函数,该函数使用jquery的post方法:

function update_point_session(){
    $.post('/update_point_session/', 
           {session: true},
           function(data){}
    );
    return true;
}

我使用onsubmit来触发它。

问题是在提交表单时它不会发送它。但如果我return false;它会(虽然形式本身,当然不会)。看起来好像$.post在页面通过表单定向到另一个页面之前没有发送..

所以我认为我return true;之后必须$.post。我试着把它放在function(data){}里面,但它不起作用..

如何从jquery和表单中同时发送帖子?

3 个答案:

答案 0 :(得分:3)

你可以做几件事。

使AJAX同步

由于$.post是,according to the documentation,相当于

$.ajax({
    type: 'POST',
    url: url,  
    data: data,
    success: success  
    dataType: dataType
});

您只需将$.post替换为等效的$.ajax来电,并将async: false添加到选项中。这将使用AJAX提交表单,然后,由于函数中的return true;,也会让浏览器正常发布表单。

仅在AJAX完成后提交表单

这涉及一些事件处理程序杂耍:

// attach submit event handler to the form
$("#myform").submit(function() { 
    // Handler immediately detaches itself, so that
    // we don't have an infinite loop when we call
    // $(this).submit() ourselves below
    $(this).unbind('submit');

    // Do the AJAX
    $.post(
        '/update_point_session/', 
        {session: true},
        function(data){
            // When the AJAX completes, tell the browser
            // to re-submit the form
            $(this).submit();
        }
    );

    // Prevent the browser from submitting it NOW,
    // because the AJAX is still running
    return false;
});

答案 1 :(得分:0)

在卸载页面之前,您必须等待异步帖子完成。您可以从服务器发送一个重定向URL,如json所示:

$('form').submit(function(e){
    $.post(this.action || '/update_point_session/', $(this).serialize(), function(data){
        // send back a redirect url from the server
        if(data.url) location.href = data.url;
    });
    e.preventDefault()
});

答案 2 :(得分:0)

我会做这样的事情。

$('form#myFormId').submit(function(evt){
    var form = $(this);
    evt.preventDefault(); // Prevents default submission
    $.post('/update_point_session/', {session: true}, function(data){
        form.unbind('submit'); //Unbind js submit event
        form.get(0).submit(); //submit the form
    });
});