TypeError: $ .ajax (...) non è una funzione?


231

Sto cercando di creare una semplice richiesta AJAX che restituisce alcuni dati da un database MySQL. Ecco la mia funzione di seguito:

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

... ed ecco dove lo chiamo, analizzando i parametri richiesti:

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

Tuttavia, il mio callback di successo non viene eseguito (poiché "successo!" Non è registrato sulla console) e viene visualizzato un errore nella mia console:

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

Cosa significa questo? Ho già fatto richieste AJAX prima in cui l'evento di successo innesca una funzione anonima all'interno di $ .ajax, ma ora sto cercando di eseguire una funzione denominata separata (in questo caso, una richiamata). Come posso procedere?


2
se jquery è incluso
— Arun P Johny

2
cambia questo $ .ajax () ({in $ .ajax ({
— Prabhu Murthy

3
Hai chiamato $.ajaxsenza argomenti ( $.ajax()) e il valore restituito è un oggetto jqXHR, che non è una funzione. Quindi $.ajax()(...)genererà un errore.
— Felix Kling,

2
o hai perso di includere jquery.js O hai incluso jquery.js sotto la chiamata della funzione OPPURE prova jQuery.ajax (sostituisci $ con jQuery).
— Pranay Bhardwaj,

90
Nel mio caso, è perché ho usato sottile minified versione di jQuery, che tira fuori Ajax funzione
— TomNg

Risposte:


952

Nessuna delle risposte qui mi ha aiutato. Il problema era: stavo usando la build sottile di jQuery , che aveva rimosso alcune cose, ajax essendo una di queste.

La soluzione: Basta scaricare la versione normale (compresso o meno) di jQuery qui e includerlo nel progetto.


56
Questo è ciò che ha risolto il mio problema! Che diamine jQuery ?? Perché viene $.ajaxrimosso dalla build "slim"?
— Samnau,

57
La corporatura magra reclamò un'altra vittima.
— Ha disegnato Kennedy il

49
Ho copiato il codice da Bootstrap. Usano la versione slim. Forse anche tu?
— Cirillo N.

126

Ricontrolla se stai utilizzando la versione completa di jquery e non una versione sottile.

Stavo usando il link jnery cdn-script fornito con jquery. Il problema è che questo è di default slim.jquery.js che non ha la ajaxfunzione al suo interno. Quindi, se stai usando (copia-incolla dal sito Web Bootstrap) il link dello script jquery versione slim, usa invece la versione completa.

Vale a dire usare <script src="https://code.jquery.com/jquery-3.1.1.min.js"> invece di <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"


27

Non sono sicuro, ma sembra che tu abbia un errore di sintassi nel tuo codice. Provare:

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

Accanto c'erano parentesi extra $.ajaxche non erano necessarie. Se l'errore persiste, il file di script jQuery non viene caricato.


2
Non è un errore di sintassi. Si aspettava che il valore restituito fosse una funzione che non lo è.
— Felix Kling,

Ahhh capisco. Quindi, davvero, questo problema è solo un riferimento al file di script jQuery mancante davvero.
— Jason Evans,

3
No. Guardalo come $.ajax()();. Questo è JavaScript valido. Significa "chiama $.ajaxe qualunque cosa restituisca, chiamala pure". Ma $.ajaxnon restituisce una funzione (che potrebbe essere chiamata), restituisce un jqXHRoggetto, quindi genera un errore. La tua risposta è corretta, le ulteriori ()sono il problema, ma la descrizione del problema non è corretta (non è un errore di sintassi, almeno non per il parser).
— Felix Kling,

No, scusa, è quello che stavo affermando nel mio commento precedente; che questo non è un problema di errore di sintassi, poiché la sintassi è valida, ma piuttosto un problema con il file di script jQuery non caricato al momento dell'utilizzo di $ .ajax ().
— Jason Evans,

2
No, non manca jquery.js (se fosse l'errore si tratterebbe di $) ma non è neanche un errore di sintassi in quanto è valido JS. Non è semplicemente la sintassi appropriata per il comportamento desiderato, quindi provoca un errore di runtime come spiegato da Felix.
— nnnnnn,

9

Acquista la documentazione di Jquery

Avviso di deprecazione: i callback jqXHR.success (), jqXHR.error () e jqXHR.complete () vengono rimossi da jQuery 3.0. È invece possibile utilizzare jqXHR.done (), jqXHR.fail () e jqXHR.always ().


3
Questo non è rilevante per la domanda, nessuno di quei metodi deprecati sono in uso con questa domanda ..
— Kevin B

3

Hai un errore nella tua funzione AJAX, troppe parentesi, prova invece $.ajax({


3

Fai riferimento alla versione minima di jquery che include ajax:

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

2

Si è verificato un errore di sintassi dopo aver inserito la parentesi dopo la funzione ajax e un'altra serie di parentesi per definire l'elenco degli argomenti: -

Come hai scritto: -

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

La parentesi attorno a Ajax deve essere rimossa dovrebbe essere: -

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

1

Ho riscontrato la stessa domanda e la mia soluzione era: aggiungere lo script JQuery.

In particolare, dovremmo assicurarci che il JQuery corrispondente sia caricato quando eseguiamo il debug dei nostri js sotto firefox / chrome.


1

Se stai utilizzando il modello html bootstrap, ricorda di rimuovere il collegamento a jquery slim nella parte inferiore del modello. Pubblico questo dettaglio qui perché non posso ancora commentare le risposte ..


0

Per chiunque cerchi di eseguirlo in nodejs : non funzionerà immediatamente , poiché jquery ha bisogno di un browser (o simile)! Stavo solo cercando di far funzionare l'importazione e stavo registrando quello console.log($)che ha scritto [Function]e poi anche quello console.log($.ajax)che è tornato undefined. Non ho avuto tscerrori e ho completato automaticamente da Intellij, quindi mi chiedevo cosa stesse succedendo.

Poi ad un certo punto mi sono reso conto che nodepotrebbe essere il problema e non il dattiloscritto. Ho provato lo stesso codice nel browser e ha funzionato. Per farlo funzionare devi eseguire:

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

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

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


-1

È troppo tardi per una risposta, ma questa risposta può essere utile per i futuri lettori.

Vorrei condividere uno scenario in cui, diciamo, ci sono più file HTML ( un HTML di base e più sub-HTML ) e $ .ajax viene utilizzato in uno dei sub-HTML.

Supponiamo che nel sub-HTML, js sia incluso tramite l'URL " https://code.jquery.com/jquery-3.5.0.js " e nell'HTML di base / padre, tramite URL - " https: //code.jquery .com / jquery-3.1.1.slim.min.js ", la versione slim di JS verrà utilizzata in tutte le pagine che utilizzano questo sub-HTML e l'HTML di base sopra menzionato.

Questo è particolarmente vero nel caso in cui si usi il framework bootstrap che carica js usando " https://code.jquery.com/jquery-3.1.1.slim.min.js ".

Quindi, per risolvere il problema, è necessario assicurarsi che in tutte le pagine, js sia incluso tramite l'URL " https://code.jquery.com/jquery-3.5.0.js " o qualunque sia l'URL più recente contenente tutte le librerie JQuery.

Grazie a Lily H. per avermi indicato questa risposta.


-2

lasciami condividere la mia esperienza:

il mio designer di pagine HTML usa:

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

quando creo una semplice richiesta AJAX, ricevendo un errore che dice, TypeError: $ .ajax (...) non è una funzione

Quindi, aggiungo:

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

quindi, funziona perfettamente almeno per me.


No. Caricare jQuery slim e sovrascriverlo immediatamente con jQuery è assolutamente inutile e spreca larghezza di banda.
— Quentin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.