【问题标题】:Uncaught TypeError: $.ajax(...).success is not a function未捕获的 TypeError: $.ajax(...).success 不是函数
【发布时间】:2016-08-19 14:54:50
【问题描述】:

我是 jQuery 新手,在 node.js 上使用了一个使用这个 sn-p 的旧教程:

$(function () {    
    var roomId;

    $.ajax({
        type: "GET",
        url: "/api/rooms"
    }).success(function (rooms) { 
        roomId = rooms[0].id;
        getMessages();
        $.each(rooms, function (key, room) {
            var a = '<a href="#" data-room-id="' + room.id + '" class="room list-group-item">' + room.name + '</a>';
            $("#rooms").append(a);
        });

    });

    [...]       

});

但是我得到了这个错误

未捕获的 TypeError: $.ajax(...).success 不是函数

}).success(function (rooms) {

我想知道这里有什么问题?

【问题讨论】:

标签: javascript jquery ajax


【解决方案1】:

对 ajax 的调用应该如下所示:

$.ajax({
    type: "GET",
    url: "/api/rooms",
    success: function (rooms) { 

    }
});

你没有方法链成功函数,它是字典参数中的条目之一。

【讨论】:

  • 您可以链接成功函数调用,但您需要使用示例@jsfiddle.net/f7h8heb5 中所示的 .done(),但您还可以在 ajax 调用中添加成功选项,如示例所示好
  • 对,在 jqXHR 对象(由 $.ajax 返回)上的 jQuery 1.8 中,成功被替换为完成,错误被替换为失败,完成被替换为总是。 stackoverflow.com/a/8847853/5774375
【解决方案2】:

你的代码是正确的没有问题

但您可能包含不允许 .success() 方法的新 jquery 库

对于较新版本的 jquery 使用

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<script>
    $.ajax({
        type: "GET",
        url: "/api/rooms",
        success: function (rooms) {

        }
    });
</script>

如果您使用的是旧 jquery,.success() 方法将毫无问题地运行

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<script>
    $.ajax({

        url: "/api/rooms",
        method: "GET",
        data: {'datavar': datavalue}

    }).success(function (rooms) {

        console.log("successfully run ajax request..." + rooms);

    }).done(function () {

        console.log("I am from done function");

    }).fail(function () {

        console.log("I am from fail function.");

    }).always(function () {

        console.log("I am from always function");

    });
</script>

【讨论】:

    【解决方案3】:

    根据documentation

    自 jQuery 3.0 起,jqXHR.success()jqXHR.error()jqXHR.complete() 回调方法已被删除。

    您可以改用jqXHR.done()jqXHR.fail()jqXHR.always()


    这些方法最初是作为选项回调添加到 jQuery 的 $.ajax 中的,可以这样使用

    $.ajax({
        url      : 'mypage.php',
        success  : function() { ... },
        error    : function() { ... },
        complete : function() { ... }
    });
    

    但由于用户之间的一些混淆,后来也伴随着同名的可链接方法

    $.ajax().success(  function() { ... })
            .error(    function() { ... })
            .complete( function() { ... })
    

    这些方法自 jQuery 1.8 起已被弃用,并在 jQuery 3.0 中完全删除,原因是使用了 Deferred 对象和后来的承诺。

    jqXHR.success()jqXHR.error()jqXHR.complete() 被可链接的 jqXHR.done()jqXHR.fail()jqXHR.always() 方法取代,选项回调目前仍然可用。

    从 jQuery 3.0 开始,jQuery 的 Deferred 对象 are also Promise/A+ compliant,这意味着它们是“thenable”的,也可以与 then() 一起使用

    $.ajax("/status").then(function(data) {
    
    }).catch(function(error) {
    
    });
    

    【讨论】:

    • 为了我的钱,这是最好的答案。谢谢你这么完整。
    猜你喜欢
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    相关资源
    最近更新 更多