JQuery: 'Uncaught TypeError: Illegal invocation' su richiesta ajax - diversi elementi


112

Ho due elementi selezionati, A e B: quando l'opzione selezionata di A cambia, le opzioni di B devono essere aggiornate di conseguenza. Ogni elemento in A implica molti elementi in B, è una relazione uno-a-molti (A contiene nazioni, B dovrebbe contenere città situate nella nazione data).

La funzione do_ajaxdovrebbe eseguire la richiesta asincrona:

function do_ajax(elem, mydata, filename)
{
    $.ajax({
        url: filename,
        context: elem,
        data: mydata,
        datatype: "html",
        success: function (data, textStatus, xhr) {
            elem.innerHTML = data;
        }
    });
}

Per aggiornare le opzioni di B ho aggiunto una chiamata di funzione onChangenell'evento di A. Ecco la funzione che viene eseguita quando viene attivato l'evento onChange (of A):

function my_onchange(e) // "e" is element "A"
{
    var sel_B = ... ; // get select element "B"

    // I skipped some code here
    // ...

    var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
    };
    do_ajax(city_sel, data, 'ajax_handler.php');
}

}

Ho letto nei documenti di JQuery che datapossono essere un array (coppie di valori chiave). Ottengo l'errore se metto:

var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
};

Invece, non ottengo quell'errore se i miei dati sono una stringa:

var data = 'mode=filter_city&id_A=' + e[e.selectedIndex];

Ma ho bisogno della "versione array" della variabile, nel mio codice php lato server.

Si Uncaught TypeError: Illegal invocationtrova nel file "jquery-1.7.2.min.js", che è tutto compresso, quindi non sono riuscito a capire quale parte del codice ha generato l'errore.

C'è qualche impostazione che posso modificare nel mio codice in modo che accetti i dati come array associativo?

Risposte:


151

Grazie al colloquio con Sarfraz abbiamo potuto trovare la soluzione.

Il problema era che stavo passando un elemento HTML invece del suo valore, che in realtà è quello che volevo fare (infatti nel mio codice php ho bisogno di quel valore come chiave esterna per interrogare la mia citiestabella e filtrare le voci corrette).

Quindi, invece di:

var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
};

dovrebbe essere:

var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex].value
};

Nota: controlla la risposta di Jason Kulatunga , cita il documento JQuery per spiegare perché il passaggio di un elemento HTML causava problemi.


esattamente quello che stavo facendo. Ho dimenticato di usare .val ()
Usman Shaukat

Stavo passando l'opzione, di un elemento html di selezione in una variabile. Non ho notato che non era testo semplice ma html.
Sterling Diaz

46

Dai documenti jQuery per processData:

processData Boolean
Predefinito: true
Per impostazione predefinita, i dati passati all'opzione data come oggetto (tecnicamente, qualsiasi cosa diversa da una stringa) verranno elaborati e trasformati in una stringa di query, adattandosi al tipo di contenuto predefinito "application / x-www -Form-urlencoded". Se desideri inviare un DOMDocument o altri dati non elaborati, imposta questa opzione su false.

Fonte: http://api.jquery.com/jquery.ajax

Sembra che dovrai usare processDataper inviare i tuoi dati al server o modificare il tuo script php per supportare i parametri codificati della stringa di query.


1
Questo è vero. Se avessi potuto vederlo prima, mi avrebbe indicato l'errore effettivo nel mio codice. Grazie, aggiungerò una nota nella mia risposta.
Nadir Sampaoli

25

Ho ricevuto questo errore durante la pubblicazione di un oggetto FormData perché non stavo impostando correttamente la chiamata ajax. La configurazione di seguito ha risolto il mio problema.

var myformData = new FormData();        
myformData.append('leadid', $("#leadid").val());
myformData.append('date', $(this).val());
myformData.append('time', $(e.target).prev().val());

$.ajax({
    method: 'post',
    processData: false,
    contentType: false,
    cache: false,
    data: myformData,
    enctype: 'multipart/form-data',
    url: 'include/ajax.php',
    success: function (response) {
        $("#subform").html(response).delay(4000).hide(1); 
    }
});

grazie uomo. Mi hai salvato la giornata e il mio problema è stato risolto aggiungendo "processData: false, contentType: false, cache: false" nel mio corpo ajax. Molte grazie.
CumaTekin

11

Ho letto nei documenti di JQuery che i dati possono essere un array (coppie di valori chiave). Ottengo l'errore se metto:

Questo è un oggetto non un array:

var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
};

Probabilmente vuoi:

var data = [{
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
}];

1
non genera più quell'errore ma sembra che questi dati non vengano passati al mio $_GETarray lato server ( var_export($_GET)output array ( 'undefined' => 'undefined', ))
Nadir Sampaoli

@nadirs: prova a definire il tipo di metodo nel tuo $.ajaxgestore:type:'get',
Sarfraz

@Sarfraz il risultato è lo stesso. Lato server, le datachiavi dovrebbero essere trovate nell'array GET, giusto? O forse vengono comunque inviati tramite un altro metodo di richiesta?
Nadir Sampaoli

@nadirs: qualcosa del genere funziona data: {foo:'myfoo', bar:'mybar'}, penso che potrebbe esserci qualche altro problema.
Sarfraz

@Sarfraz Sono un idiota, stavo inviando un oggetto HTML e[e.selectedIndex]mentre avrei dovuto passare il suo valore e[e.selectedIndex].value. Dopo aver corretto questo difetto, la notazione dell'oggetto funziona bene.
Nadir Sampaoli

7

Ha avuto lo stesso problema di recente, risolto aggiungendo traditional: true,


Questo in realtà funziona, presumo solo per i browser moderni però
barnacle.m

0
function do_ajax(elem, mydata, filename)
{
    $.ajax({
        url: filename,
        context: elem,
        data: mydata,
        **contentType: false,
        processData: false**
        datatype: "html",
        success: function (data, textStatus, xhr) {
            elem.innerHTML = data;
        }
    });
}

4
Una buona risposta è più di un semplice snippet di codice. Dovrebbe spiegare perché questo risponde alla domanda iniziale e fornire collegamenti alla documentazione pertinente, se disponibile.
JSTL

Senza i due campi contentTypee processData, l'errore continuerà a essere visualizzato. Ho aggiunto i due campi e per me ha funzionato. Penso che op stesse cercando di indicare i due campi importanti.
Ekundayo Blessing Funminiyi

-1
$.ajax({
                    url:"",
                    type: "POST",
                    data: new FormData($('#uploadDatabaseForm')[0]),
                    contentType:false,
                    cache: false,
                    processData:false,
                    success:function (msg) {}
                  });

7
Le risposte sono più utili se includi una spiegazione.
Jon B

-2

Prova questo:

            $.ajax({
                    url:"",
                    type: "POST",
                    data: new FormData($('#uploadDatabaseForm')[0]),
                    contentType:false,
                    cache: false,
                    processData:false,
                    success:function (msg) {}
                  });
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.