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

Kar*_*lom 35 javascript ajax jquery

我是jQuery的新手,并使用一个旧的教程node.js,使用这个片段:

$(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);
        });

    });

    [...]       

});
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误

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

}).success(function (rooms) {

我想知道这里有什么不对吗?

JCo*_*ton 43

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

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

    }
});
Run Code Online (Sandbox Code Playgroud)

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

  • 您可以链接成功函数调用,但您需要使用示例@https://jsfiddle.net/f7h8heb5/ 中显示的 .done(),但您也在 ajax 调用中添加成功选项,如示例所示 (2认同)
  • 是的,在jqXHR对象的jQuery 1.8上(由$ .ajax返回)成功被替换为完成,错误失败并且总是完成.http://stackoverflow.com/a/8847853/5774375 (2认同)

Sha*_*are 27

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

但是你可能会包含不允许使用.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>
Run Code Online (Sandbox Code Playgroud)

如果你使用旧的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>
Run Code Online (Sandbox Code Playgroud)


ade*_*neo 10

根据文件

jqXHR.success(),jqXHR.error()jqXHR.complete()回调方法也会被删除的jQuery 3.0.

您可以使用jqXHR.done(), jqXHR.fail()jqXHR.always()来代替.


这些方法最初被添加到jQuery $.ajax作为选项回调,就像这样使用

$.ajax({
    url      : 'mypage.php',
    success  : function() { ... },
    error    : function() { ... },
    complete : function() { ... }
});
Run Code Online (Sandbox Code Playgroud)

然而,由于用户之间的一些混淆,他们后来也伴随着具有相同名称的可链接方法

$.ajax().success(  function() { ... })
        .error(    function() { ... })
        .complete( function() { ... })
Run Code Online (Sandbox Code Playgroud)

这些方法自jQuery 1.8以来已被弃用,并且由于使用了Deferred对象而在jQuery 3.0中被完全删除,以及后来的承诺.

jqXHR.success(),jqXHR.error()以及jqXHR.complete()由可链接superseeded jqXHR.done(), jqXHR.fail()jqXHR.always()方法,选项回调仍可用于现在.

在jQuery 3.0,jQuery的递延对象也无极/ A +兼容,这意味着它们是"thenable",并且可以与被使用then(),以及

$.ajax("/status").then(function(data) {

}).catch(function(error) {

});
Run Code Online (Sandbox Code Playgroud)

  • 对于我的钱来说,这是最好的答案。谢谢你如此完整。 (2认同)