$.post和$.ajax有什么区别?

77

想知道有关数据参数的区别。

我有一个$.post方法,将$('#myform').serialize()作为我的数据参数使用起来很有效。

如果我尝试使用$.ajax()方法,由于我的数据参数不正确,它就无法正常工作。

有人知道差异在哪里以及我可以使用什么替代上述.serialize吗?


1
相似的内容:https://dev59.com/x2sz5IYBdhLWcg3w-89v - Techie
7个回答

99

这个jQuery论坛帖子概括了:

$.post是使用$.ajax简写的方式来进行POST请求,因此在使用这两种方法之间并没有太大的区别——它们都使用了相同的基础代码。$.get也是采用类似的原理。

—addyosmani

简而言之:

$.post( "/ajax", {"data" : json }) 

等同于以下内容:

$.ajax({ 
  type: "POST", 
  url: "/ajax", 
  data: {"data": json} 
});

52

这里的问题不在于 $.ajax() 没有工作,而是因为您没有在Ajax请求中设置type参数,默认为GET请求。对于get请求,数据通过查询字符串发送,如果后端期望它们作为post参数,它将无法读取它们。

$.post 只是一个带有设置type$.ajax()调用。阅读文档,您会发现默认情况下$.ajax()是GET请求,正如我上面所提到的。

如果您转到jQuery文档中的 jQuery.post 页面,它将向您展示带有设置类型的$.ajax请求。再次阅读文档。


28

在重新阅读一些在线文档后,我决定坚持使用 $.post 而不是 $.ajax。

$.ajax 方法的 data 参数与 $.post 方法有所不同,具体原因我不确定,但它们确实有区别。

我想使用 $.ajax 的唯一原因是我想要处理事件,并没有意识到我可以使用 $.post 实现。

以下是我的最终选择:

function GetSearchItems() {
    var url = '@Url.Action("GetShopSearchResults", "Shop", New With {.area = "Shop"})';
    var data = $("#ShopPane").serialize();
    // Clear container
    $('#shopResultsContainer').html('');
    // Retrieve data from action method
    var jqxhr = $.post(url, data);
    // Handle results
    jqxhr.success(function(result) {
        //alert("ajax success");
        $('#shopResultsContainer').html(result.ViewMarkup);
    });
    jqxhr.error(function() {
        //alert("ajax error");
    });
    jqxhr.complete(function() {
        //alert("ajax complete");
    });

    // Show results container
    $("#shopResultsContainer").slideDown('slow');
}

JQuery 3.x

自jQuery 3.0版本起,jqXHR.success()、jqXHR.error()和jqXHR.complete() 回调方法被移除。您可以使用jqXHR.done()、jqXHR.fail()和jqXHR.always()代替。

var jqxhr = $.post(url, data);
// Handle results
jqxhr.done(function(result) {
    //alert("ajax success");
});
jqxhr.fail(function() {
    //alert("ajax error");
});
jqxhr.always(function() {
    //alert("ajax complete");
});

https://api.jquery.com/jquery.post/


2
自jQuery 3.0版本起,jqXHR.success()、jqXHR.error()和jqXHR.complete()回调方法已被删除。 - Dennis Heiden
非常清楚。这篇帖子是4年前发布的。 - Ed DeGagne
你为什么撤销了我对你回答的补充? - Dennis Heiden
1
Dennis,非常抱歉,这完全是我的失误。我已经纠正了它。 - Ed DeGagne
没问题,只是想问一下是否有做错什么或者需要改进我的编辑。祝你有美好的一周。 - Dennis Heiden

13
你是否将它指定为数据参数?$.post只是$.ajax的速记形式,后者期望以下内容。
$.ajax({
    type : 'POST',
    url : url,
    data : data,
    success : success,
    dataType : dataType
});

4
作为补充,接受的答案中提到:“$.ajax方法的data参数与$.post方法有所不同,具体不确定是什么,但确实存在差异”。
请尝试使用:
    { 
        ... 
        data: JSON.stringify(yourJsonData), 
        ... 
    }

否则,JSON对象将作为URL编码字符串插入到有效载荷中。

0

通过使用$.ajax,我们可以进行GET或POST请求。 使用$.post,我们只能进行POST请求。 使用$.get,我们只能进行GET请求。

$.ajax()    // Performs an async AJAX request
$.get()     // Loads data from a server using an AJAX HTTP GET request
$.post()    // Loads data from a server using an AJAX HTTP POST request

-7
$.ajax中,您可以同步,但在$.post函数中不可能。同步意味着您可以获取返回的结果。
var tmp;
$.ajax({
    'async': false,
    'type': "POST",
    'global': false,
    'dataType': 'html',
    'url': "Your Url",
    'data': {'type': 'data'},
    'success': function (data) {
        tmp = data;
    }
});
alert(tmp);

4
不对。你可以通过以下方式获得返回结果: $.post("your.php", function(data) { _把**data**作为你的返回结果_ }) - blurgoon
nagaking,这是绝对不正确的信息,不应该有任何赞。$.ajax,$.post和$.get都可以返回结果。 - Ed DeGagne
@EdDeGagne 你无法在post函数之外获取返回响应。 - nagaking
根据我所见,异步选项已被弃用,为了从ajax调用中获得结果,有更好的方法可以避免使我们的浏览器变得不响应,比如使用成功回调函数。 - Nmaster88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接