jQuery - Doa ilegal


108

jQuery v1.7.2

Saya memiliki fungsi ini yang memberi saya kesalahan berikut saat menjalankan:

Uncaught TypeError: Illegal invocation

Berikut fungsinya:

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

Jika saya menghapus datadari panggilan ajax, itu berhasil .. ada saran?

Terima kasih!


coba hapus fromdari data. Mungkin ini bertentangan dengan jquery dari
gopi1410

6
Anda menyadari Anda mencoba mendorong objek jQuery, bukan JSON kan?
asawyer

18
Terjadi pada saya secara teratur ketika saya lupa .val () pada beberapa objek jQuery ...
userfuser

Jawaban:


118

Saya pikir Anda perlu memiliki string sebagai nilai datanya. Sepertinya ada sesuatu secara internal dalam jQuery yang tidak mengkodekan / membuat serial dengan benar Objek Ke & Dari.

Mencoba:

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

Perhatikan juga pada baris:

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

Anda tidak memerlukan pembungkus jQuery karena To & From sudah menjadi objek jQuery.


2
Terima kasih, lupa saya telah memuat objek alih-alih string, biasanya saya memuat string :)
yoda

3
Pendekatan ini membantu saya. Saya menamai variabel saya karena $from = $('#from');Ini membantu saya mengingat bahwa itu mewakili objek jQuery yang membantu menghindari memanggil metode pada sesuatu yang berupa string atau mencoba memanipulasi string dengan .toString()atau sesuatu ketika itu adalah objek jQuery.
timbrown

Saya memiliki .val()bagian yang hilang, jadi tidak melewati nilainya.
SharpC

109

Coba atur processData: false dalam pengaturan ajax seperti ini

$.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.

Anda mungkin juga perlu menambahkan contentType: false. Saya lakukan saat mengunggah file. Lihat stackoverflow.com/questions/21044798/…
khylo

18

Sebagai catatan, itu juga bisa terjadi jika Anda mencoba menggunakan variabel yang tidak dideklarasikan dalam data seperti

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

1
Terima kasih untuk itu!! Di sanalah saya diblokir.
Matt Zelenak

13

Jika Anda ingin mengirimkan formulir menggunakan Javascript FormData API dengan mengunggah file, Anda perlu menyetel dua opsi di bawah ini:

processData: false,
contentType: false

Anda dapat mencoba sebagai berikut:

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

Apa fungsi kedua opsi ini, dapatkah Anda jelaskan?
rahim.nagori

2

Dalam kasus saya, saya baru saja berubah

Catatan: Ini dalam kasus Django, jadi saya menambahkan csrftoken. Dalam kasus Anda, Anda mungkin tidak membutuhkannya.

Ditambahkan contentType: false,processData: false

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

    }
})

untuk

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

    }
})

dan itu berhasil.


2

Dalam kasus saya, saya belum menentukan semua variabel yang saya teruskan ke data di ajax.

var page = 1;

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

Saya baru saja mendefinisikan variabel var search_candidate = "candidate name";dan cara kerjanya.

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

Masalah saya tidak terkait dengan processData. Itu karena saya mengirim fungsi yang tidak dapat dipanggil nanti applykarena tidak memiliki cukup argumen. Secara khusus saya seharusnya tidak digunakan alertsebagai errorpanggilan balik.

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

Lihat jawaban ini untuk informasi lebih lanjut tentang mengapa itu bisa menjadi masalah: Mengapa panggilan fungsi tertentu disebut "pemanggilan ilegal" di JavaScript?

Cara saya dapat menemukan ini adalah dengan menambahkan a console.log(list[ firingIndex ])ke jQuery sehingga saya dapat melacak apa yang ditembakkannya.

Ini adalah perbaikannya:

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

Dalam kasus saya (menggunakan webpack 4) dalam fungsi anonim, yang saya gunakan sebagai panggilan balik.

Saya harus menggunakan window.$.ajax()alih-alih $.ajax()meskipun memiliki:

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

0

Juga ini penyebabnya juga: Jika Anda membuat koleksi jQuery (melalui .map () atau yang serupa) maka Anda tidak boleh menggunakan koleksi ini dalam data .ajax (). Karena itu masih objek jQuery , bukan JavaScript Array biasa . Anda harus menggunakan .get () di dan untuk mendapatkan array js biasa dan harus menggunakannya pada setelan data di .ajax ().

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.