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?

Nadir Sampaoli
sumber

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.

Nadir Sampaoli
sumber
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.

Jason Kulatunga
sumber
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); 
    }
});
Mike Volmar
sumber
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]
}];
Sarfraz
sumber
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,

deco
sumber
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;
        }
    });
}
Derly Pacheco
sumber
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) {}
                  });
Nitin Sharma
sumber
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) {}
                  });
Ali Asad
sumber