TypeError: $ .ajax (…) - це не функція?


231

Я намагаюся створити простий запит AJAX, який повертає деякі дані з бази даних MySQL. Ось моя функція нижче:

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

... і ось, де я це називаю, аналізуючи необхідні параметри:

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

Тим не менш, мій зворотний виклик успіху не працює (оскільки "успіх!" Не реєструється на консолі), і я отримую помилку в консолі:

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

Що це означає? Я робив запити AJAX раніше, коли подія успіху запускає анонімну функцію всередині $ .ajax, але зараз я намагаюся запустити окрему функцію з назвою (у цьому випадку зворотний виклик). Як мені це зробити?


2
чи включено jquery
— Arun P Johny

2
змінити цей $ .ajax () ({на $ .ajax ({
— Прабху Мерті

3
Ви викликали $.ajaxбез аргументів ( $.ajax()), а значення, що повертається, є об'єктом jqXHR, що не є функцією. Значить $.ajax()(...), викине помилку.
— Фелікс Клінг

2
або ви пропустили включити jquery.js АБО ви включили jquery.js нижче виклику функції АБО, будь ласка, спробуйте jQuery.ajax (замініть $ на jQuery).
— Pranay Bhardwaj

90
У моєму випадку це тому, що я використовував тонку мінімізовану версію JQuery, яка виконує функцію ajax
— TomNg

Відповіді:


952

Жодна з відповідей тут мені не допомогла. Проблема полягала в тому, що я використовував тонку збірку jQuery , у якій були вилучені деякі речі, ajax - одна з них.

Рішення: Просто скачайте регулярний (стислий чи ні) версії JQuery тут і включити його в проект.


56
Це те, що вирішило мою проблему! Що за чорт jQuery ?? Чому його $.ajaxвидаляють із "тонкої" збірки?
— samnau

57
Тонке складання вимагало ще однієї жертви.
— Дрю Кеннеді

49
Я скопіював код з Bootstrap. Вони використовують тонкий варіант. Може, і ти?
— Кирило Н.

126

Перевірте, чи використовуєте ви повну версію jquery, а не якусь тонку версію.

Я використовував посилання jquery cdn-script, яке поставляється з jquery. Проблема в тому, що ця за замовчуванням - slim.jquery.js, яка не має в ній ajaxфункції. Отже, якщо ви використовуєте (скопійоване з веб-сайту Bootstrap) посилання сценарію для тонкої версії jquery, використовуйте замість нього повну версію.

Тобто використання <script src="https://code.jquery.com/jquery-3.1.1.min.js"> замість цього <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"


27

Не впевнений, але схоже, що у вашому коді є синтаксична помилка. Спробуйте:

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

У вас були додаткові дужки, поруч з $.ajaxякими вони не потрібні були. Якщо ви все-таки отримаєте помилку, тоді файл сценарію jQuery не завантажується.


2
Це не синтаксична помилка. Щойно очікуване повернення було функцією, якої вона не є.
— Фелікс Клінг

А-а-а, я бачу. Тож справді ця проблема є лише відсутнім посиланням на файл сценарію jQuery.
— Джейсон Еванс

3
Ні. Подивіться на це як $.ajax()();. Це дійсний JavaScript. Це означає "зателефонуйте, $.ajaxі що б він не повернувся, також дзвоніть". Але $.ajaxне повертає функцію (яку можна було б назвати), вона повертає jqXHRоб'єкт, тому видає помилку. Ваша відповідь правильна, додаткова ()проблема, але опис проблеми невірний (це не синтаксична помилка, ну принаймні не для синтаксичного аналізу).
— Фелікс Клінг

Ні, вибачте, саме про це я говорив у своєму попередньому коментарі; що це не проблема помилки синтаксису, оскільки синтаксис є дійсним, а скоріше проблемою з файлом сценарію jQuery, який не завантажується під час $ .ajax ().
— Джейсон Еванс

2
Ні, jquery.js не відсутній (якби помилка була б про те $), але це не синтаксична помилка в тому, що це дійсний JS. Це просто не відповідний синтаксис для бажаної поведінки, тому він викликає помилку виконання, як пояснив Фелікс.
— nnnnnn

9

Оформлення документації Jquery

Повідомлення про депрекацію: зворотні виклики jqXHR.success (), jqXHR.error () та jqXHR.complete () видаляються з jQuery 3.0. Ви можете використовувати jqXHR.done (), jqXHR.fail () та jqXHR.always () замість цього.


3
Це взагалі не стосується питання, жоден із цих застарілих методів не використовується з цим питанням ..
— Кевін Б

3

У вас є помилка у функції AJAX, занадто багато дужок, спробуйте натомість $.ajax({


3

Посилання на версію min jquery, що включає ajax:

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

2

Під час розміщення дужок після функції ajax та іншого набору дужок для визначення списку аргументів є помилка синтаксису: -

Як ви вже писали:

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

Дужки навколо Ajax повинні бути видалені, це повинно бути: -

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

1

У мене виникло те саме питання, і моє рішення було: додати сценарій JQuery.

Тим більше, ми повинні переконатися, що відповідний JQuery завантажений, коли ми налагоджуємо js під firefox / chrome.


1

Якщо ви використовуєте HTML-шаблон завантажувача, не забудьте видалити посилання на jquery slim в нижній частині шаблону. Я публікую цю деталь тут, оскільки поки не можу коментувати відповіді.


0

Для тих, хто намагається запустити це в nodejs : це не вийде з поля, оскільки jquery потрібен браузер (або подібний)! Я просто намагався змусити імпорт запуститись і провів журнал, console.log($)який написав, [Function]а потім і console.log($.ajax)який повернувся undefined. У мене не булоtsc помилок і мав автозавершення від intellij, тому мені було цікаво, що відбувається.

Тоді в якийсь момент я зрозумів, що це nodeможе бути проблема, а не машинопис. Я спробував той самий код у браузері, і він спрацював. Для роботи вам потрібно запустити:

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

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

(кредити: https://stackoverflow.com/a/4129032/3022127 )


-1

Це вже пізно для відповіді, але ця відповідь може бути корисною для майбутніх читачів.

Я хотів би поділитися сценарієм, коли, скажімо, є кілька html-файлів ( один базовий html та кілька під-HTML ), а $ .ajax використовується в одному з під-HTML-кодів.

Припустимо, в під HTML-код js включається через URL-адресу " https://code.jquery.com/jquery-3.5.0.js " та в базовий / батьківський HTML, через URL - " https: //code.jquery .com / jquery-3.1.1.slim.min.js ", тонка версія JS буде використовуватися на всіх сторінках, які використовують цей під-HTML, а також базовий HTML, згаданий вище.

Це особливо актуально у випадку використання фреймворка для завантаження, який завантажує js за допомогою " https://code.jquery.com/jquery-3.1.1.slim.min.js ".

Отже, щоб вирішити проблему, потрібно переконатися, що js на всіх сторінках включений через URL " https://code.jquery.com/jquery-3.5.0.js " або будь-яку останню URL-адресу, що містить усі бібліотеки JQuery.

Дякую Лілі Х., що вказала мені на цю відповідь.


-2

дозвольте мені поділитися своїм досвідом:

моє використання дизайнера html-сторінок:

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

коли я створюю простий запит AJAX, отримуючи помилку, на яку він пише, TypeError: $ .ajax (…) не є функцією

Отже, я додаю:

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

значить, це прекрасно працює принаймні для мене.


Ні. Завантаження jQuery тонке, а потім негайно перезапис його jQuery вкрай безглуздо і марно витрачається на пропускну здатність.
— Квентін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.