2012-04-25 9 views
73

jQuery v1.7.2jQuery - Illegaler Aufruf

Ich habe diese funcion, die mir die folgende Fehlermeldung zu geben, während der Ausführung:

Uncaught TypeError: Illegal invocation 

Hier ist die Funktion:

$('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; 
}); 

Wenn Ich entferne data von Ajax Anruf, es funktioniert .. irgendwelche Vorschläge?

Danke!

+0

try Entfernen 'from' von Daten. Vielleicht ist es im Konflikt mit JQuery von – gopi1410

+5

Sie erkennen, dass Sie versuchen, jQuery Objekte, nicht JSON richtig drücken? – asawyer

+8

passiert mir regelmäßig, wenn ich die. Val() auf einigen jQuery-Objekt vergessen ... – userfuser

Antwort

84

Ich denke, Sie müssen Zeichenfolgen als Datenwerte haben. Es ist wahrscheinlich etwas innerhalb von jQuery ist nicht korrekt zu kodieren/serialisieren die To & From Objects.

Versuch:

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

Hinweis auch auf den Linien

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

Sie brauchen nicht auf die jQuery-Wrapper als zu & Von sind bereits Objekte jQuery.

+2

Danke, vergaß ich hatte Objekte anstelle von Strings geladen, in der Regel lade ich Strings :) – yoda

+3

Dieser Ansatz hilft mir. Ich benenne meine Variablen als '$ from = $ ('# from');' Dies hilft mir, daran zu erinnern, dass es ein jQuery-Objekt darstellt, das vermeidet, eine Methode für eine Zeichenfolge aufzurufen oder eine Zeichenfolge mit '.toString () 'oder etwas, wenn es sich um ein jQuery-Objekt handelt. – timbrown

+0

Ich hatte das '.val()' Teil fehlt, also übergab es den Wert nicht. – SharpC

61

Try verarbeite zu setzen: false in Ajax-Einstellungen wie diese

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

Warum funktioniert das? – aandis

+3

'Standardmäßig werden Daten, die als Objekt an die Datenoption übergeben werden (technisch, alles andere als eine Zeichenfolge), verarbeitet und in eine Abfragezeichenfolge umgewandelt, passend zum Standardinhaltstyp" application/x-www-form- urlencodiert ". Wenn Sie ein DOMDocument oder andere nicht verarbeitete Daten senden möchten, setzen Sie diese Option auf false.' –

+0

Danke funktioniert einwandfrei. –

14

Nur für das Protokoll es auch, wenn Sie

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

Danke dafür !! Das war total, wo ich blockiert wurde. –

0

in Daten wie nicht deklarierten Variablen zu verwenden versuchen passieren kann Mein Problem war unabhängig von processData. Das lag daran, dass ich eine Funktion gesendet habe, die später nicht mit apply aufgerufen werden kann, weil sie nicht genügend Argumente hatte. Insbesondere hätte ich alert nicht als error Rückruf verwenden sollen.

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

Sehen Sie diese Antwort für weitere Informationen darüber, warum das ein Problem sein kann: Why are certain function calls termed "illegal invocations" in JavaScript?

Die Art und Weise ich in der Lage war dies ein console.log(list[ firingIndex ]) zu jQuery war zu entdecken, durch Zugabe so konnte ich verfolgen, was sie feuert.

Dies war der fix:

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