jquery - 同步提交帖子(不是ajax)

时间:2010-10-02 15:02:53

标签: jquery post synchronous

我有一个页面(page 1)接受发布请求,做一些事情并在最后显示一些数据。

从其他页面(page 2),我想在点击按钮时重定向到page 1,当然要通过POST发送page 1所需的所有相关数据。

当然,我可以使用在页面上有一个不可见形式的旧hack,在用户点击按钮之后填入我需要的所有数据,然后自动提交()。 但这看起来很麻烦 - 使用类似于$.post的语法要好得多,而不是开始操纵html。 $.post是完美的,是否实际重定向到页面而不是异步发出请求(我不能在ajaxy帖子完成后重定向到page 1,因为page 1需要显示某些内容的数据。)

有没有办法用jquery做我想要的东西,或者丑陋的隐形形式是唯一的出路?

P.S

我知道还有其他令人费解的方法可以达到我想要的效果,例如使用$.post并在我们当前所在的页面中植入回复的html,但我只是想知道是否有直截了当使用jquery

执行此操作的方法

5 个答案:

答案 0 :(得分:15)

这让我想到了一个小jQuery函数来模仿你所描述的$ .post行为。它仍然在后台使用不可见的形式,但它的语法相对简洁明了。

$(document).ready(function(){
    $('#myButton').PostIt('post.php', {foo:'bar', abc:'def', life:42});
    $('#myOtherButton').PostIt('post.php', dataObjectFromSomewhereElse);
});

$.fn.PostIt = function(url, data){

  $(this).click(function(event){

        event.preventDefault();

        $('body').append($('<form/>', {
          id: 'jQueryPostItForm',
          method: 'POST',
          action: url
        }));

        for(var i in data){
          $('#jQueryPostItForm').append($('<input/>', {
            type: 'hidden',
            name: i,
            value: data[i]
          }));
        }

        $('#jQueryPostItForm').submit();
    });
}

答案 1 :(得分:9)

我将Greg W的代码改编为可以在代码中调用的直接函数:

function postIt(url, data){

    $('body').append($('<form/>', {
      id: 'jQueryPostItForm',
      method: 'POST',
      action: url
    }));

    for(var i in data){
      $('#jQueryPostItForm').append($('<input/>', {
        type: 'hidden',
        name: i,
        value: data[i]
      }));
    }

    $('#jQueryPostItForm').submit();
}

答案 2 :(得分:0)

如果您必须发出POST请求,那么隐形表单是您更好的选择之一。

如果您的应用程序将使用GET请求,我会将数据编码到查询字符串中并执行。

document.location.href =

您可以使用jQuery.serialize生成查询字符串。

答案 3 :(得分:0)

我想答案是没有直接的方式。有关添加此功能的常规功能,请参阅Greg W的回答。

答案 4 :(得分:-2)

HTML:

<form id="myform" method="get" acction="page2">
   <!-- data -->
</form>

JS:

$('#myform').bind('submit', function(ev) {

  ev.stopPropagation();

  var ok = true;
  //manipulate html and 'ok'

  return ok;   // if ok == false, don't execute post


});