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.