jQuery: invocazione illegale


108

jQuery v1.7.2

Ho questa funzione che mi dà il seguente errore durante l'esecuzione:

Uncaught TypeError: Illegal invocation

Ecco la funzione:

$('form[name="twp-tool-distance-form"]').on('submit', function(e) {
    e.preventDefault();

    var from = $('form[name="twp-tool-distance-form"] input[name="from"]');
    var to = $('form[name="twp-tool-distance-form"] input[name="to"]');
    var unit = $('form[name="twp-tool-distance-form"] input[name="unit"]');
    var speed = game.unit.speed($(unit).val());

    if (!/^\d{3}\|\d{3}$/.test($(from).val()))
    {
        $(from).css('border-color', 'red');
        return false;
    }

    if (!/^\d{3}\|\d{3}$/.test($(to).val()))
    {
        $(to).css('border-color', 'red');
        return false;
    }

    var data = {
        from : from,
        to : to,
        speed : speed
    };

    $.ajax({
        url : base_url+'index.php',
        type: 'POST',
        dataType: 'json',
        data: data,
        cache : false
    }).done(function(response) {
        alert(response);
    });

    return false;
});

Se rimuovo datada ajax call, funziona .. qualche suggerimento?

Grazie!


prova a rimuovere fromdai dati. Forse è in conflitto con jquery da
gopi1410

6
Ti rendi conto che stai cercando di inviare oggetti jQuery, non JSON, giusto?
avvocato

18
Mi succede regolarmente quando dimentico il .val () su qualche oggetto jQuery ...
userfuser

Risposte:


118

Penso che tu abbia bisogno di stringhe come valori dei dati. È probabile che qualcosa all'interno di jQuery non codifichi / serializzi correttamente gli oggetti To & From.

Provare:

var data = {
    from : from.val(),
    to : to.val(),
    speed : speed
};

Nota anche sulle righe:

$(from).css(...
$(to).css(

Non è necessario il wrapper jQuery poiché To & From sono già oggetti jQuery.


2
Grazie, ho dimenticato di aver caricato oggetti invece di stringhe, di solito carico stringhe :)
yoda

3
Questo approccio mi aiuta. Denomino le mie variabili come $from = $('#from');Questo mi aiuta a ricordare che rappresenta un oggetto jQuery che aiuta a evitare di chiamare un metodo su qualcosa che è una stringa o provare a manipolare una stringa con .toString()o qualcosa del genere quando è un oggetto jQuery.
timbrown

Mi .val()mancava la parte, quindi non ha superato il valore.
SharpC

109

Prova a impostare processData: false in impostazioni ajax come questa

$.ajax({
    url : base_url+'index.php',
    type: 'POST',
    dataType: 'json',
    data: data,
    cache : false,
    processData: false
}).done(function(response) {
    alert(response);
});

8
By default, data passed in to the data option as an object (technically, anything other than a string) will be processed and transformed into a query string, fitting to the default content-type "application/x-www-form-urlencoded". If you want to send a DOMDocument, or other non-processed data, set this option to false.
BOTJr.

Potrebbe anche essere necessario aggiungere contentType: false. Ho fatto durante il caricamento di un file. Vedere stackoverflow.com/questions/21044798/...
khylo

18

Solo per la cronaca, può anche accadere se provi a utilizzare una variabile non dichiarata in dati come

var layout = {};
$.ajax({
  ...
  data: {
    layout: laoyut // notice misspelled variable name
  },
  ...
});

1
Grazie per quello !! Era proprio lì che venivo bloccato.
Matt Zelenak

13

Se desideri inviare un modulo utilizzando Javascript FormData API con il caricamento di file, devi impostare le seguenti due opzioni:

processData: false,
contentType: false

Puoi provare come segue:

//Ajax Form Submission
$(document).on("click", ".afs", function (e) {
    e.preventDefault();
    e.stopPropagation();
    var thisBtn = $(this);
    var thisForm = thisBtn.closest("form");
    var formData = new FormData(thisForm[0]);
    //var formData = thisForm.serializeArray();

    $.ajax({
        type: "POST",
        url: "<?=base_url();?>assignment/createAssignment",
        data: formData,
        processData: false,
        contentType: false,
        success:function(data){
            if(data=='yes')
            {
                alert('Success! Record inserted successfully');
            }
            else if(data=='no')
            {
                alert('Error! Record not inserted successfully')
            }
            else
            {
                alert('Error! Try again');
            }
        }
    });
});

Cosa fanno queste due opzioni, potresti spiegare?
rahim.nagori

2

Nel mio caso, sono appena cambiato

Nota: questo è nel caso di Django, quindi ho aggiunto csrftoken. Nel tuo caso, potresti non averne bisogno.

Aggiunto contentType: false,processData: false

Commentata "Content-Type": "application/json"

$.ajax({
    url: location.pathname, 
    type: "POST",
    crossDomain: true,
    dataType: "json",
    headers: {
        "X-CSRFToken": csrftoken,
        "Content-Type": "application/json"
    },
    data:formData,
    success: (response, textStatus, jQxhr) => {

    },
    error: (jQxhr, textStatus, errorThrown) => {

    }
})

per

$.ajax({
    url: location.pathname, 
    type: "POST",
    crossDomain: true,
    dataType: "json",
    contentType: false,
    processData: false,
    headers: {
        "X-CSRFToken": csrftoken
        // "Content-Type": "application/json",
    },
    data:formData,
    success: (response, textStatus, jQxhr) => {

    },
    error: (jQxhr, textStatus, errorThrown) => {

    }
})

e ha funzionato.


2

Nel mio caso non ho definito tutte le variabili che sto passando ai dati in ajax.

var page = 1;

$.ajax({
    url: 'your_url',
    type: "post",
    data: { 'page' : page, 'search_candidate' : search_candidate }
    success: function(result){
        alert('function called');
    }
)}

Ho appena definito la variabile var search_candidate = "candidate name";e il suo funzionamento.

var page = 1;
var search_candidate = "candidate name"; // defined
$.ajax({
    url: 'your_url',
    type: "post",
    data: { 'page' : page, 'search_candidate' : search_candidate }
    success: function(result){
        alert('function called');
    }
)}

0

Il mio problema non era correlato a processData. È stato perché ho inviato una funzione che non può essere chiamata in seguito applyperché non aveva abbastanza argomenti. In particolare, non avrei dovuto usare alertcome errorcallback.

$.ajax({
    url: csvApi,
    success: parseCsvs,
    dataType: "json",
    timeout: 5000,
    processData: false,
    error: alert
});

Vedere questa risposta per ulteriori informazioni sul motivo per cui questo può essere un problema: perché alcune chiamate di funzione vengono definite "invocazioni illegali" in JavaScript?

Il modo in cui sono stato in grado di scoprirlo è stato aggiungendo console.log(list[ firingIndex ])a jQuery in modo da poter tenere traccia di cosa stava sparando.

Questa era la soluzione:

function myError(jqx, textStatus, errStr) {
    alert(errStr);
}

$.ajax({
    url: csvApi,
    success: parseCsvs,
    dataType: "json",
    timeout: 5000,
    error: myError // Note that passing `alert` instead can cause a "jquery.js:3189 Uncaught TypeError: Illegal invocation" sometimes
});

0

Nel mio caso (utilizzando webpack 4) all'interno di una funzione anonima, che stavo usando come callback.

Ho dovuto usare window.$.ajax()invece di $.ajax()nonostante avessi :

import $ from 'jquery';
window.$ = window.jQuery = $;

0

Anche questa è una causa: se hai costruito una raccolta jQuery (tramite .map () o qualcosa di simile), non dovresti usare questa raccolta nei dati di .ajax (). Perché è ancora un oggetto jQuery , non un semplice array JavaScript . Dovresti usare .get () in e per ottenere un semplice array js e dovresti usarlo nell'impostazione dei dati su .ajax ().

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.