it-swarm.com.de

jQuery - Unzulässiger Aufruf

jQuery v1.7.2

Ich habe diese Funktion, die mir beim Ausführen folgende Fehlermeldung gibt:

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 data aus einem Ajax-Aufruf entferne, funktioniert es .. irgendwelche Vorschläge?

Vielen Dank!

85
yoda

Ich denke, Sie müssen Strings als Datenwerte haben. Es ist wahrscheinlich etwas in jQuery, dass die To & From-Objekte nicht korrekt codiert/serialisiert werden.

Versuchen:

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

Beachten Sie auch auf den Zeilen:

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

Sie benötigen den jQuery-Wrapper nicht, da "To & From" bereits jQuery-Objekte sind.

101
LessQuesar

Versuchen Sie, processData: false in ajax-Einstellungen wie folgt einzustellen

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

Nur für die Aufzeichnung kann es auch passieren, wenn Sie versuchen, nicht deklarierte Variablen in Daten wie zu verwenden

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

Wenn Sie ein Formular über Javascript FormData API mit dem Hochladen von Dateien senden möchten, müssen Sie zwei Optionen festlegen:

processData: false,
contentType: false

Sie können es wie folgt versuchen:

//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');
            }
        }
    });
});
5
Bablu Ahmed

In meinem Fall habe ich nicht alle Variablen definiert, die ich in Ajax an Daten übergebe.

var page = 1;

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

Ich habe gerade die Variable var search_candidate = "candidate name"; definiert und sie funktioniert.

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

Mein Problem hatte nichts mit processData zu tun. Dies liegt 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-Callback verwenden sollen.

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

In dieser Antwort finden Sie weitere Informationen, warum dies ein Problem sein kann: Warum werden bestimmte Funktionsaufrufe in JavaScript als "illegale Aufrufe" bezeichnet?

Ich konnte das herausfinden, indem ich jQuery mit console.log(list[ firingIndex ]) hinzufügte, damit ich verfolgen konnte, was geschossen wurde.

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

In meinem Fall habe ich mich gerade verändert

Anmerkung: Dies ist im Fall von Django, also habe ich csrftoken hinzugefügt. In Ihrem Fall brauchen Sie es möglicherweise nicht.

contentType: false, processData: false hinzugefügt

Auskommentiert "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) => {

    }
})

zu

$.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) => {

    }
})

und es hat funktioniert.

0
hygull