LoạiError: $ .ajax (Hoài) không phải là một hàm?


231

Tôi đang cố gắng tạo một yêu cầu AJAX đơn giản để trả về một số dữ liệu từ cơ sở dữ liệu MySQL. Đây là chức năng của tôi dưới đây:

function AJAXrequest(url, postedData, callback) {
    $.ajax() ({
        type: 'POST',
        url: url,
        data: postedData,
        dataType: 'json',
        success: callback
    });
}

... Và đây là nơi tôi gọi nó, phân tích các tham số bắt buộc:

AJAXrequest('voting.ajax.php', imageData, function(data) {
    console.log("success!");
});

Tuy nhiên, cuộc gọi lại thành công của tôi không chạy (vì "thành công!" Không được ghi vào bảng điều khiển) và tôi gặp lỗi trong bảng điều khiển của mình:

TypeError: $.ajax(...) is not a function.
success: callback

Điều đó có nghĩa là gì? Tôi đã thực hiện các yêu cầu AJAX trước khi sự kiện thành công kích hoạt một hàm ẩn danh bên trong $ .ajax, nhưng bây giờ tôi đang cố chạy một hàm có tên riêng (trong trường hợp này là gọi lại). Làm thế nào để tôi đi về điều này?


2
có bao gồm jquery hay không
Arun P Johny

2
thay đổi $ .ajax () ({thành $ .ajax ({
Mitchhu Murthy

3
Bạn đã gọi $.ajaxmà không có đối số ( $.ajax()) và giá trị trả về là một đối tượng jqXHR, đây không phải là một hàm. Do đó $.ajax()(...)sẽ ném một lỗi.
Felix Kling

2
hoặc bạn đã bỏ lỡ để bao gồm jquery.js HOẶC bạn đã bao gồm jquery.js bên dưới hàm gọi HOẶC vui lòng thử jQuery.ajax (thay $ bằng jQuery).
Pranay Bhardwaj

90
Trong trường hợp của tôi, đó là vì tôi đã sử dụng mỏng được rút gọn phiên bản của JQuery đó sẽ đưa ra ajax chức năng
TomNg

Câu trả lời:


952

Không có câu trả lời ở đây đã giúp tôi. Vấn đề là: Tôi đã sử dụng bản dựng mỏng của jQuery , đã loại bỏ một số thứ, ajax là một trong số đó.

Giải pháp: Chỉ cần tải xuống phiên bản jQuery (nén hoặc không) thông thường tại đây và đưa nó vào dự án của bạn.


56
Đây là những gì đã khắc phục vấn đề của tôi! Cái quái gì vậy ?? Tại sao $.ajaxbị xóa khỏi bản dựng "mỏng"?
samnau

57
Slim xây dựng một nạn nhân khác.
Drew Kennedy

49
Tôi đã sao chép mã từ Bootstrap. Họ sử dụng phiên bản mỏng. Có lẽ bạn cũng vậy?
Cyril N.

126

Kiểm tra kỹ nếu bạn đang sử dụng phiên bản đầy đủ của jquery chứ không phải một số phiên bản mỏng.

Tôi đã sử dụng liên kết cdn-script jquery đi kèm với jquery. Vấn đề là cái này theo mặc định là slim.jquery.js không cóajax chức năng trong đó. Vì vậy, nếu bạn đang sử dụng (sao chép từ trang web Bootstrap) liên kết tập lệnh jquery phiên bản mỏng, thay vào đó hãy sử dụng phiên bản đầy đủ.

Đó là nói sử dụng <script src="https://code.jquery.com/jquery-3.1.1.min.js"> thay vì <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"


27

Không chắc chắn, nhưng có vẻ như bạn có lỗi cú pháp trong mã của bạn. Thử:

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

Bạn đã có thêm dấu ngoặc bên cạnh $.ajaxmà không cần thiết. Nếu bạn vẫn gặp lỗi, thì tệp script jQuery không được tải.


2
Đây không phải là lỗi cú pháp. Giá trị trả về chỉ được dự kiến ​​là một hàm mà nó không phải là.
Felix Kling

Tôi hiểu rồi. Vì vậy, thực sự, vấn đề này chỉ là một tài liệu tham khảo tệp script jQuery bị thiếu thực sự.
Jason Evans

3
Không. Hãy nhìn nó như $.ajax()();. Đây là JavaScript hợp lệ. Nó có nghĩa là "cuộc gọi $.ajaxvà bất cứ điều gì nó trả lại, gọi nó là tốt". Nhưng $.ajaxkhông trả về một hàm (có thể được gọi), nó trả về một jqXHRđối tượng, vì vậy nó sẽ ném một lỗi. Câu trả lời của bạn là chính xác, bổ sung ()là vấn đề, nhưng mô tả vấn đề không chính xác (đó không phải là lỗi cú pháp, ít nhất là không dành cho trình phân tích cú pháp).
Felix Kling

Không, xin lỗi, đó là những gì tôi đã nêu trong nhận xét trước đây của mình; rằng đây không phải là vấn đề lỗi cú pháp, vì cú pháp hợp lệ, mà là một vấn đề với tệp tập lệnh jQuery không được tải tại thời điểm $ .ajax () được sử dụng.
Jason Evans

2
Không, jquery.js không bị thiếu (nếu đó là lỗi sẽ xảy ra $) nhưng đó không phải là lỗi cú pháp trong đó là mã JS hợp lệ. Đó chỉ là cú pháp không phù hợp cho hành vi mong muốn, do đó, nó gây ra lỗi thời gian chạy như được giải thích bởi Felix.
nnnnnn

9

Kiểm tra Tài liệu Jquery

Thông báo khấu hao : Các cuộc gọi lại jqXHR.success (), jqXHR.error () và jqXHR.complete () được loại bỏ kể từ jQuery 3.0. Bạn có thể sử dụng jqXHR.done (), jqXHR.fail () và jqXHR.always ().


3
Điều này hoàn toàn không liên quan đến câu hỏi, không có phương pháp nào không được sử dụng cho câu hỏi này ..
Kevin B

3

Thay vào đó, bạn gặp lỗi trong hàm AJAX, quá nhiều dấu ngoặc, hãy thử $.ajax({


3

Tham khảo phiên bản jquery min bao gồm ajax:

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

2

Có lỗi cú pháp khi bạn đã đặt dấu ngoặc sau hàm ajax và một bộ dấu ngoặc đơn khác để xác định danh sách đối số: -

Như bạn đã viết: -

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

Dấu ngoặc quanh ajax phải được loại bỏ: -

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

1

Tôi gặp phải câu hỏi tương tự và giải pháp của tôi là: thêm tập lệnh JQuery.

Đặc biệt, chúng ta nên đảm bảo JQuery tương ứng được tải khi chúng ta gỡ lỗi js của chúng ta dưới firefox / chrome.


1

Nếu bạn đang sử dụng mẫu html bootstrap, hãy nhớ xóa liên kết đến jquery slim ở dưới cùng của mẫu. Tôi đăng chi tiết này ở đây vì tôi không thể bình luận câu trả lời nào ..


0

Đối với bất kỳ ai đang cố gắng chạy cái này trong nodejs : Nó sẽ không hoạt động, vì jquery cần một trình duyệt (hoặc tương tự)! Tôi chỉ cố gắng để nhập dữ liệu để chạy và đã đăng nhập console.log($)mà đã viết [Function]và sau đó cũng console.log($.ajax)trả lại undefined. Tôi không cótsc lỗi và đã tự động hoàn thành từ intellij, vì vậy tôi đã tự hỏi điều gì đang xảy ra.

Sau đó, tại một số điểm tôi nhận ra rằng đó nodecó thể là vấn đề và không phải là bản thảo. Tôi đã thử mã tương tự trong trình duyệt và nó đã hoạt động. Để làm cho nó hoạt động, bạn cần chạy:

require("jsdom").env("", function(err, window) {
    if (err) {
        console.error(err);
        return;
    }

    var $ = require("jquery")(window);
});

(tín dụng: https://stackoverflow.com/a/4129032/3022127 )


-1

Đây là quá muộn cho một câu trả lời nhưng phản hồi này có thể hữu ích cho độc giả trong tương lai.

Tôi muốn chia sẻ một kịch bản trong đó, giả sử có nhiều tệp html ( một html cơ sở và nhiều HTML phụ ) và $ .ajax đang được sử dụng trong một trong các HTML phụ.

Giả sử trong HTML phụ, js được bao gồm thông qua URL " https://code.jquery.com/jquery-3.5.0.js " và trong HTML cơ sở / gốc, qua URL - " https: //code.jquery .com / jquery-3.1.1.slim.min.js ", sau đó phiên bản mỏng của JS sẽ được sử dụng trên tất cả các trang sử dụng HTML phụ này cũng như HTML cơ sở được đề cập ở trên.

Điều này đặc biệt đúng trong trường hợp sử dụng khung bootstrap tải js bằng cách sử dụng " https://code.jquery.com/jquery-3.1.1.slim.min.js ".

Vì vậy, để giải quyết vấn đề, cần đảm bảo rằng trong tất cả các trang, js được bao gồm thông qua URL " https://code.jquery.com/jquery-3.5.0.js " hoặc bất kỳ URL nào mới nhất chứa tất cả các thư viện JQuery.

Cảm ơn Lily H. đã chỉ cho tôi câu trả lời này.


-2

hãy để tôi chia sẻ kinh nghiệm của tôi:

nhà thiết kế trang html của tôi sử dụng:

<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>

Khi tôi tạo một yêu cầu AJAX đơn giản, nhận được một lỗi, TypeError: $ .ajax (Hoài) không phải là một hàm

Vì vậy, tôi thêm:

<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>

sau đó, nó hoàn toàn làm việc cho tôi ít nhất


Không. Tải jQuery mỏng và ngay lập tức ghi đè lên nó bằng jQuery hoàn toàn vô nghĩa và lãng phí băng thông.
Quentin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.