JQuery: ajax isteğinde 'Yakalanmamış TypeError: Yasadışı çağrı' - birkaç öğe


112

İki seçme öğem var, A ve B: A'nın seçili seçeneği değiştiğinde, B'nin seçenekleri buna göre güncellenmelidir. A'daki her öğe, B'deki birçok unsuru ifade eder, bu bire çok ilişkidir (A ulusları içerir, B verilen ulusta bulunan şehirleri içermelidir).

İşlev do_ajax, eşzamansız isteği çalıştırmalıdır:

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

B'nin seçeneklerini güncellemek için A'nın onChangeetkinliğine bir işlev çağrısı ekledim . OnChange olayı (of A) tetiklendiğinde çalışan işlev şu şekildedir :

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

}

İçinde okuduğunuz JQuery dokümanlardata bir dizi (anahtar değeri çifti) olabilir. Eğer koyarsam hatayı alıyorum:

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

Bunun yerine, verilerim bir dizeyse bu hatayı almıyorum:

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

Ancak, sunucu tarafı php kodumda değişkenin "dizi sürümüne" ihtiyacım var.

Uncaught TypeError: Illegal invocationBen kod parçası hata geçirilen anlamaya could not nedenle, tüm sıkıştırılır "jquery-1.7.2.min.js" dosyasında yer almaktadır.

Kodumda verileri ilişkilendirilebilir dizi olarak kabul edecek şekilde değiştirebileceğim herhangi bir ayar var mı?

Yanıtlar:


152

Sarfraz ile yapılan görüşmeye teşekkürler yaptığımız çözümü bulabildik.

Sorun, değeri yerine bir HTML elemanını geçiriyor olmamdı, aslında yapmak istediğim şey buydu (aslında php kodumda, tablomu sorgulamak citiesve doğru girdileri filtrelemek için bu değere yabancı anahtar olarak ihtiyacım var ).

Yani, bunun yerine:

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

olmalı:

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

Not: Jason Kulatunga'nın cevabını kontrol edin , bir HTML öğesini geçmenin neden sorunlara neden olduğunu açıklamak için JQuery dokümanından alıntı yapıyor.


tam olarak ne yapıyordum. .Val () kullanmayı unuttum
Usman Shaukat

Bir değişkendeki bir select html öğesinin seçeneğini iletiyordum. Düz metin değil html olduğunu fark etmedim.
Sterling Diaz

46

JQuery belgelerinden şunlar için processData:

processData Boolean
Varsayılanı: true
Varsayılan olarak, veri seçeneğine bir nesne olarak aktarılan veriler (teknik olarak, bir dizeden başka herhangi bir şey) işlenir ve varsayılan içerik türü "application / x-www 'ye uyan bir sorgu dizesine dönüştürülür -formu-urlencoded". Bir DOMDocument veya diğer işlenmemiş verileri göndermek istiyorsanız, bu seçeneği false olarak ayarlayın.

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

Görünüşe göre processDataverilerinizi sunucuya göndermek için kullanmanız veya kodlanmış sorgu dizgisi parametrelerini desteklemek için php betiğinizi değiştirmeniz gerekecek.


1
Bu doğru. Daha önce görebilseydim, kodumdaki gerçek hataya işaret ederdi. Teşekkürler, cevabıma bir not ekleyeceğim.
Nadir Sampaoli

25

Ajax çağrısını doğru şekilde ayarlamadığım için bir FormData nesnesi gönderirken bu hatayı alıyordum. Aşağıdaki kurulum sorunumu çözdü.

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

teşekkürler dostum. günümü kurtardınız ve sorunum ajax gövdeme "processData: false, contentType: false, cache: false" eklenerek çözüldü. Çok teşekkürler.
CumaTekin

11

JQuery belgelerinde verilerin bir dizi (anahtar değer çiftleri) olabileceğini okudum. Eğer koyarsam hatayı alıyorum:

Bu nesne bir dizi değil:

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

Muhtemelen istiyorsun:

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

1
artık bu hatayı atmıyor, ancak bu veriler $_GETdizime sunucu tarafıma ( var_export($_GET)çıktılar array ( 'undefined' => 'undefined', )) aktarılmıyor gibi görünüyor
Nadir Sampaoli

@nadirs: $.ajaxİşleyicinizdeki yöntem türünü tanımlamayı deneyin :type:'get',
Sarfraz

@Sarfraz sonuç aynı. Sunucu tarafında, dataanahtarlar GET dizisinde bulunmalıdır, değil mi? Ya da belki yine de başka bir istek yöntemiyle gönderiliyorlar?
Nadir Sampaoli

@nadirs: Bunun gibi bir şey işe yarıyor data: {foo:'myfoo', bar:'mybar'}, sanırım başka bir problem olabilir.
Sarfraz

@Sarfraz Ben bir HTML nesnesi gönderdiğini, bir aptalım e[e.selectedIndex]ben değerini geçti gerekirken e[e.selectedIndex].value. Bu kusuru giderdikten sonra, nesne gösterimi iyi çalışıyor.
Nadir Sampaoli

7

Son zamanlarda aynı sorun vardı, ekleyerek çözüldü traditional: true,


Bu gerçekten işe yarıyor, sadece modern tarayıcılar için varsayıyorum
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
Bir güzel cevap sadece kod parçacığı daha fazladır. Bunun neden ilk soruyu yanıtladığını açıklamalı ve varsa ilgili belgelere bağlantılar sağlamalıdır.
JSTL

İki alan olmadan contentTypeve processDatahata görünmeye devam edecektir. İki alanı ekledim ve benim için çalıştı. Sanırım op iki önemli alanı göstermeye çalışıyordu.
Ekundayo Blessing Funminiyi

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

7
Bir açıklama eklerseniz cevaplar daha yararlıdır.
Jon B

-2

Bunu dene:

            $.ajax({
                    url:"",
                    type: "POST",
                    data: new FormData($('#uploadDatabaseForm')[0]),
                    contentType:false,
                    cache: false,
                    processData:false,
                    success:function (msg) {}
                  });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.