Ошибка типа: $ .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!");
});

Тем не менее, мой успешный обратный вызов не запускается (так как «success!» Не зарегистрирован на консоли), и я получаю сообщение об ошибке в моей консоли:

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

Что это значит? Ранее я выполнял запросы AJAX, когда событие успеха вызывает анонимную функцию внутри $ .ajax, но сейчас я пытаюсь запустить отдельную именованную функцию (в данном случае, обратный вызов). Как мне это сделать?

ReactingToAngularVues
источник
2
включен ли jquery
Арун П Джонни
2
измените этот $ .ajax () ({на $ .ajax ({
Прабху Мурти
3
Вы вызвали $.ajaxбез arguments ( $.ajax()), а возвращаемое значение - объект jqXHR, который не является функцией. Следовательно $.ajax()(...)выкинет ошибку.
Феликс Клинг
2
Либо вы пропустили включение jquery.js, ИЛИ вы включили jquery.js ниже вызова функции ИЛИ, пожалуйста, попробуйте jQuery.ajax (замените $ на jQuery).
Пранай Бхардвадж
90
В моем случае это потому, что я использовал уменьшенную уменьшенную версию JQuery, которая выполняет функцию ajax
TomNg

Ответы:

952

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

Решение: просто скачайте обычную (сжатую или нет) версию jQuery здесь и включите ее в свой проект.

Гас
источник
56
Это то, что исправило мою проблему! Какого черта jQuery ?? Почему $.ajaxубирается из "стройной" сборки?
Самнау
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"

karthiks
источник
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 ().

Mahbub
источник
3
Это вообще не имеет отношения к вопросу, ни один из этих устаревших методов не используется с этим вопросом ..
Кевин Б.
3

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

netvision73
источник
3

Обратитесь к минимальной версии 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
});
abhinsit
источник
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 )

bersling
источник
-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.

Спасибо Лили Х. за указание на этот ответ.

AwsAnurag
источник
-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 slim и последующая перезапись его с помощью jQuery совершенно бессмысленны и бесполезны.
Квентин