2012-04-25 13 views
73

jQuery v1.7.2jQuery - invocazione illegale

Ho questa funcion che mi sta dando 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 Rimuovere data da una chiamata ajax, funziona ... qualche suggerimento?

Grazie!

+0

provare a rimuovere 'from' dai dati. Forse è in conflitto con jquery da – gopi1410

+5

Ti rendi conto che stai provando a spingere oggetti jQuery, non JSON giusto? – asawyer

+8

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

risposta

84

Penso che sia necessario disporre di stringhe come valori dei dati. È probabile che qualcosa internamente in jQuery non codifichi/serializzi correttamente il To To & From Objects.

prova:

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

noti anche sulle linee

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

non è necessario l'involucro jQuery come Per & Da sono già oggetti jQuery.

+2

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

+3

Questo approccio mi aiuta. Io chiamo 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 tenta di manipolare una stringa con '.toString () 'o qualcosa quando si tratta di un oggetto jQuery. – timbrown

+0

Ho avuto la parte '.val()' mancante, quindi non stava passando il valore. – SharpC

61

tenta di impostare processData: true nelle impostazioni ajax come questo

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

perché funziona? – aandis

+3

'Per impostazione predefinita, i dati passati all'opzione dati 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 si desidera inviare un DOMDocument o altri dati non elaborati, impostare questa opzione su false. –

+0

Grazie perfettamente. –

14

Solo per la cronaca può anche accadere se si tenta di utilizzare variabile non dichiarata nei dati come

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

Grazie per quello !! Quello era il punto in cui ero bloccato. –

0

mio il problema non era correlato a processData. Era perché ho inviato una funzione che non può essere chiamata più tardi con apply perché non aveva argomenti sufficienti. Nello specifico, non avrei dovuto utilizzare alert come callback error.

$.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: Why are certain function calls termed "illegal invocations" in JavaScript?

Il modo in cui sono stato in grado di scoprire questo è stato con l'aggiunta di un console.log(list[ firingIndex ]) a jQuery così ho potuto tenere traccia di quello che stava sparando.

Questa è stata la correzione:

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 
});