TypeError: $ .ajax (…) ist keine Funktion?

231

Ich versuche, eine einfache AJAX-Anforderung zu erstellen, die einige Daten aus einer MySQL-Datenbank zurückgibt. Hier ist meine Funktion unten:

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

... und hier nenne ich es, indem ich die erforderlichen Parameter analysiere:

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

Mein Erfolgsrückruf wird jedoch nicht ausgeführt (da "Erfolg!" Nicht an der Konsole protokolliert wird), und in meiner Konsole wird eine Fehlermeldung angezeigt:

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

Was bedeutet das? Ich habe zuvor AJAX-Anfragen gestellt, bei denen das Erfolgsereignis eine anonyme Funktion innerhalb von $ .ajax auslöst, aber jetzt versuche ich, eine separate benannte Funktion auszuführen (in diesem Fall einen Rückruf). Wie gehe ich vor?

Reagieren auf AngularVues
quelle
2
ob jquery enthalten ist
Arun P Johny
2
ändere diese $ .ajax () ({in $ .ajax ({
Prabhu Murthy
3
Sie haben $.ajaxohne Argumente ( $.ajax()) aufgerufen und der Rückgabewert ist ein jqXHR-Objekt, das keine Funktion ist. Daher $.ajax()(...)wird ein Fehler ausgelöst.
Felix Kling
2
Entweder haben Sie jquery.js nicht eingefügt, oder Sie haben jquery.js unterhalb des Funktionsaufrufs eingefügt, oder Sie versuchen es mit jQuery.ajax (ersetzen Sie $ durch jQuery).
Pranay Bhardwaj
90
In meinem Fall liegt es daran, dass ich eine schlanke, minimierte Version von JQuery verwendet habe, die die
Ajax-

Antworten:

947

Keine der Antworten hier hat mir geholfen. Das Problem war: Ich habe den schlanken Build von jQuery verwendet , bei dem einige Dinge entfernt wurden, darunter auch Ajax.

Die Lösung: Einfach die regelmäßige Download (komprimiert oder nicht) Version von jQuery hier und es in Ihrem Projekt.

Gus
quelle
55
Dies hat mein Problem behoben! Was zum Teufel jQuery? Warum wird $.ajaxaus dem "schlanken" Build entfernt?
Samnau
53
Schlanker Körperbau forderte ein weiteres Opfer.
Drew Kennedy
47
Ich habe den Code von Bootstrap kopiert. Sie verwenden die schlanke Version. Vielleicht auch du?
Cyril N.
126

Überprüfen Sie noch einmal, ob Sie die Vollversion von jquery und keine schlanke Version verwenden.

Ich habe den jquery cdn-script Link verwendet, der mit jquery geliefert wird. Das Problem ist, dass dieses standardmäßig slim.jquery.js ist, das das nicht hatajax Funktion . Wenn Sie also einen JQuery-Skript-Link mit schlanker Version verwenden (von der Bootstrap-Website kopiert), verwenden Sie stattdessen die Vollversion.

Das heißt, verwenden <script src="https://code.jquery.com/jquery-3.1.1.min.js"> statt <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"

karthiks
quelle
27

Ich bin mir nicht sicher, aber es sieht so aus, als ob Sie einen Syntaxfehler in Ihrem Code haben. Versuchen:

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

Sie hatten zusätzliche Klammern, neben $.ajaxdenen nicht benötigt wurden. Wenn der Fehler weiterhin angezeigt wird, wird die jQuery-Skriptdatei nicht geladen.

Jason Evans
quelle
2
Es ist kein Syntaxfehler. Es wurde nur erwartet, dass der Rückgabewert eine Funktion ist, die es nicht ist.
Felix Kling
Ahhh ich verstehe. Dieses Problem ist also wirklich nur eine fehlende Referenz auf die jQuery-Skriptdatei.
Jason Evans
3
Schau es dir an als $.ajax()();. Dies ist gültiges JavaScript. Es bedeutet "Anruf $.ajaxund was auch immer es zurückgibt, nenne es auch". Gibt $.ajaxjedoch keine Funktion zurück (die aufgerufen werden könnte), sondern ein jqXHRObjekt, sodass ein Fehler ausgegeben wird. Ihre Antwort ist richtig, die zusätzlichen ()sind das Problem, aber die Beschreibung des Problems ist nicht korrekt (es ist kein Syntaxfehler, zumindest nicht für den Parser).
Felix Kling
Nein, tut mir leid, das habe ich in meinem vorherigen Kommentar gesagt. Dies ist kein Syntaxfehlerproblem, da die Syntax gültig ist, sondern ein Problem mit der jQuery-Skriptdatei, die zum Zeitpunkt der Verwendung von $ .ajax () nicht geladen wurde.
Jason Evans
2
Nein, jquery.js fehlt nicht (wenn es der Fehler wäre, würde es sich um das handeln $), aber es ist auch kein Syntaxfehler, da es sich um gültiges JS handelt. Es ist einfach keine geeignete Syntax für das gewünschte Verhalten, daher verursacht es einen Laufzeitfehler, wie von Felix erklärt.
nnnnnn
9

Kasse Die Jquery-Dokumentation

Hinweis Deprecation : Die jqXHR.success (), jqXHR.error () und jqXHR.complete () Rückrufe entfernt werden als von jQuery 3.0. Sie können stattdessen jqXHR.done (), jqXHR.fail () und jqXHR.always () verwenden.

Mahbub
quelle
3
Dies ist für die Frage überhaupt nicht relevant, keine dieser veralteten Methoden wird mit dieser Frage verwendet.
Kevin B
3

Sie haben einen Fehler in Ihrer AJAX-Funktion, zu viele Klammern, versuchen Sie es stattdessen $.ajax({

netvision73
quelle
3

Verweisen Sie auf die jquery min-Version, die ajax enthält:

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

Es liegt ein Syntaxfehler vor, da Sie nach der Ajax-Funktion eine Klammer und einen weiteren Satz Klammern gesetzt haben, um die Argumentliste zu definieren: -

Wie Sie geschrieben haben:

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

Die Klammer um Ajax muss entfernt werden. Es sollte sein: -

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

Ich bin auf dieselbe Frage gestoßen, und meine Lösung lautete: Fügen Sie das JQuery-Skript hinzu.

Insbesondere sollten wir sicherstellen, dass die entsprechende JQuery geladen ist, wenn wir unsere js unter Firefox / Chrome debuggen.

Jianeng Xu
quelle
1

Wenn Sie eine Bootstrap-HTML-Vorlage verwenden, müssen Sie den Link zu jquery slim am unteren Rand der Vorlage entfernen. Ich poste dieses Detail hier, da ich noch keine Antworten kommentieren kann.

Lily H.
quelle
0

Für alle, die versuchen, dies in nodejs auszuführen : Es wird nicht sofort funktionieren, da jquery einen Browser (oder ähnliches) benötigt! Ich habe nur versucht, den Import zum Laufen zu bringen und habe protokolliert, console.log($)was geschrieben [Function]und dann auch console.log($.ajax)zurückgegeben wurde undefined. Ich hatte keintsc Fehler und hatte Autocomplete von Intellij, also fragte ich mich, was los ist.

Dann wurde mir irgendwann klar, dass nodedies das Problem sein könnte und nicht das Typoskript. Ich habe den gleichen Code im Browser ausprobiert und es hat funktioniert. Damit es funktioniert, müssen Sie Folgendes ausführen:

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

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

(Credits: https://stackoverflow.com/a/4129032/3022127 )

Bersling
quelle
-1

Dies ist zu spät für eine Antwort, aber diese Antwort kann für zukünftige Leser hilfreich sein.

Ich möchte ein Szenario teilen, in dem beispielsweise mehrere HTML-Dateien ( ein Basis-HTML und mehrere Sub-HTMLs ) vorhanden sind und $ .ajax in einem der Sub-HTMLs verwendet wird.

Angenommen, im Unter-HTML ist js über die URL " https://code.jquery.com/jquery-3.5.0.js " und im Basis- / übergeordneten HTML über die URL " https: //code.jquery " enthalten .com / jquery-3.1.1.slim.min.js ", dann wird die schlanke Version von JS auf allen Seiten verwendet, die dieses Sub-HTML sowie das oben erwähnte Basis-HTML verwenden.

Dies gilt insbesondere für die Verwendung des Bootstrap-Frameworks, das js mit " https://code.jquery.com/jquery-3.1.1.slim.min.js " lädt " .

Um das Problem zu beheben, müssen Sie sicherstellen, dass js auf allen Seiten über die URL " https://code.jquery.com/jquery-3.5.0.js" enthalten ist " oder die neueste URL mit allen JQuery-Bibliotheken enthalten ist.

Vielen Dank an Lily H., die mich auf diese Antwort hingewiesen hat.

AwsAnurag
quelle
-2

Lassen Sie mich meine Erfahrungen teilen:

Mein HTML-Seitendesigner verwendet:

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

Wenn ich eine einfache AJAX-Anfrage erstelle und eine Fehlermeldung erhalte, heißt es: TypeError: $ .ajax (…) ist keine Funktion

Also füge ich hinzu:

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

dann funktioniert es zumindest bei mir perfekt.

Sriparna Ghosh
quelle
Das Laden von jQuery slim und das sofortige Überschreiben mit jQuery ist völlig sinnlos und eine Verschwendung von Bandbreite.
Quentin