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.