JQuery: 'Uncaught TypeError: Illegal invocation' pada permintaan ajax - beberapa elemen


112

Saya memiliki dua elemen terpilih, A dan B: ketika opsi yang dipilih A berubah, opsi B harus diperbarui. Setiap elemen di A menyiratkan banyak elemen di B, ini adalah hubungan satu-ke-banyak (A berisi negara, B harus berisi kota yang terletak di negara tertentu).

Fungsi tersebut do_ajaxharus menjalankan permintaan asinkron:

function do_ajax(elem, mydata, filename)
{
    $.ajax({
        url: filename,
        context: elem,
        data: mydata,
        datatype: "html",
        success: function (data, textStatus, xhr) {
            elem.innerHTML = data;
        }
    });
}

Untuk memperbarui opsi B saya telah menambahkan panggilan fungsi di onChangeacara A. Berikut adalah fungsi yang berjalan saat event onChange (of A) dipicu:

function my_onchange(e) // "e" is element "A"
{
    var sel_B = ... ; // get select element "B"

    // I skipped some code here
    // ...

    var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
    };
    do_ajax(city_sel, data, 'ajax_handler.php');
}

}

Saya telah membaca di dokumen JQuery yang databisa berupa array (pasangan nilai kunci). Saya mendapatkan kesalahan jika saya meletakkan:

var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
};

Sebaliknya, saya tidak mendapatkan kesalahan itu jika data saya adalah string:

var data = 'mode=filter_city&id_A=' + e[e.selectedIndex];

Tetapi saya membutuhkan "versi array" dari variabel tersebut, dalam kode php sisi server saya.

Itu Uncaught TypeError: Illegal invocationterletak di file "jquery-1.7.2.min.js", yang semuanya dikompresi, jadi saya tidak tahu bagian mana dari kode yang memunculkan kesalahan.

Apakah ada pengaturan yang dapat saya ubah dalam kode saya sehingga menerima data sebagai array asosiatif?

Jawaban:


151

Berkat pembicaraan dengan Sarfraz, kami dapat menemukan solusinya.

Masalahnya adalah saya melewatkan elemen HTML alih-alih nilainya, yang sebenarnya ingin saya lakukan (sebenarnya dalam kode php saya, saya memerlukan nilai itu sebagai kunci asing untuk menanyakan citiestabel saya dan memfilter entri yang benar).

Jadi, alih-alih:

var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
};

harus:

var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex].value
};

Catatan: periksa jawaban Jason Kulatunga , ini mengutip dokumen JQuery untuk menjelaskan mengapa melewatkan elemen HTML menyebabkan masalah.


persis apa yang saya lakukan. Lupa menggunakan .val ()
Usman Shaukat

Saya melewati opsi, dari elemen html pilih dalam variabel. Tidak memperhatikan itu bukan teks biasa tapi html.
Sterling Diaz

46

Dari dokumen jQuery untuk processData:

processData Boolean
Default: true
Secara default, data yang diteruskan ke opsi data sebagai objek (secara teknis, apa pun selain string) akan diproses dan diubah menjadi string kueri, sesuai dengan jenis konten default "application / x-www -form-urlencoded ". Jika Anda ingin mengirim DOMDocument, atau data tidak diproses lainnya, setel opsi ini ke false.

Sumber: http://api.jquery.com/jquery.ajax

Sepertinya Anda harus menggunakan processDatauntuk mengirim data Anda ke server, atau memodifikasi skrip php Anda untuk mendukung parameter yang dikodekan querystring.


1
Ini benar. Jika saya bisa melihatnya sebelumnya, itu akan mengarahkan saya ke kesalahan sebenarnya dalam kode saya. Terima kasih, saya akan menambahkan catatan dalam jawaban saya.
Nadir Sampaoli

25

Saya mendapatkan kesalahan ini saat memposting objek FormData karena saya tidak menyiapkan panggilan ajax dengan benar. Penyiapan di bawah memperbaiki masalah saya.

var myformData = new FormData();        
myformData.append('leadid', $("#leadid").val());
myformData.append('date', $(this).val());
myformData.append('time', $(e.target).prev().val());

$.ajax({
    method: 'post',
    processData: false,
    contentType: false,
    cache: false,
    data: myformData,
    enctype: 'multipart/form-data',
    url: 'include/ajax.php',
    success: function (response) {
        $("#subform").html(response).delay(4000).hide(1); 
    }
});

Terima kasih sobat. u menyelamatkan hari saya dan masalah saya diselesaikan dengan menambahkan "processData: false, contentType: false, cache: false," di tubuh ajax saya. Terima kasih banyak.
CumaTekin

11

Saya telah membaca di dokumen JQuery bahwa data dapat berupa array (pasangan nilai kunci). Saya mendapatkan kesalahan jika saya meletakkan:

Ini objek bukan array:

var data = {
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
};

Anda mungkin ingin:

var data = [{
        'mode': 'filter_city',
        'id_A': e[e.selectedIndex]
}];

1
itu tidak membuang kesalahan itu lagi tetapi tampaknya data ini tidak diteruskan ke $_GETsisi server array saya ( var_export($_GET)keluaran array ( 'undefined' => 'undefined', ))
Nadir Sampaoli

@nadirs: Coba tentukan jenis metode di $.ajaxpenangan Anda :type:'get',
Sarfraz

@Sarfraz hasilnya sama. Sisi server, datakunci harus ditemukan dalam array GET, bukan? Atau mungkin mereka dikirim melalui metode permintaan lain?
Nadir Sampaoli

@nadirs: Sesuatu seperti ini berfungsi data: {foo:'myfoo', bar:'mybar'}, mungkin ada beberapa masalah lain menurut saya.
Sarfraz

@Sarfraz Saya idiot, saya mengirim objek HTML e[e.selectedIndex]sementara saya harus menyampaikan nilainya e[e.selectedIndex].value. Setelah memperbaiki cacat ini, notasi objek berfungsi dengan baik.
Nadir Sampaoli

7

Mengalami masalah yang sama baru-baru ini, diselesaikan dengan menambahkan traditional: true,


Ini benar-benar berfungsi, saya berasumsi hanya untuk browser modern
barnacle.m

0
function do_ajax(elem, mydata, filename)
{
    $.ajax({
        url: filename,
        context: elem,
        data: mydata,
        **contentType: false,
        processData: false**
        datatype: "html",
        success: function (data, textStatus, xhr) {
            elem.innerHTML = data;
        }
    });
}

4
Sebuah jawaban yang baik adalah lebih dari sekedar potongan kode. Ini harus menjelaskan mengapa ini menjawab pertanyaan awal dan memberikan tautan ke dokumentasi yang relevan, jika tersedia.
JSTL

Tanpa dua bidang contentTypedan processData, kesalahan akan terus ditampilkan. Saya menambahkan dua bidang dan itu berhasil untuk saya. Saya pikir op mencoba untuk menunjukkan dua bidang penting.
Ekundayo Blessing Funminiyi

-1
$.ajax({
                    url:"",
                    type: "POST",
                    data: new FormData($('#uploadDatabaseForm')[0]),
                    contentType:false,
                    cache: false,
                    processData:false,
                    success:function (msg) {}
                  });

7
Jawaban lebih bermanfaat jika Anda menyertakan penjelasan.
Jon B

-2

Coba ini:

            $.ajax({
                    url:"",
                    type: "POST",
                    data: new FormData($('#uploadDatabaseForm')[0]),
                    contentType:false,
                    cache: false,
                    processData:false,
                    success:function (msg) {}
                  });
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.