JQuery: 'Uncaught TypeError: Illegal invocation' ตามคำขอ ajax - หลายองค์ประกอบ


112

ฉันมีองค์ประกอบที่เลือกสองรายการคือ A และ B: เมื่อตัวเลือกที่เลือกของ A เปลี่ยนไปตัวเลือกของ B จะต้องได้รับการอัปเดตตามนั้น แต่ละองค์ประกอบใน A แสดงถึงองค์ประกอบหลายอย่างใน B ซึ่งเป็นความสัมพันธ์แบบหนึ่งต่อกลุ่ม (A ประกอบด้วยประเทศ B ควรมีเมืองที่ตั้งอยู่ในประเทศที่กำหนด)

ฟังก์ชันdo_ajaxควรเรียกใช้คำขอแบบอะซิงโครนัส:

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

ในการอัปเดตตัวเลือกของ B ฉันได้เพิ่มการเรียกใช้ฟังก์ชันในonChangeเหตุการณ์ของ A นี่คือฟังก์ชันที่ทำงานเมื่อเหตุการณ์ onChange (of A) ถูกทริกเกอร์:

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

}

ฉันได้อ่านในเอกสาร JQueryซึ่งdataสามารถเป็นอาร์เรย์ (คู่ค่าคีย์) ฉันได้รับข้อผิดพลาดถ้าฉันใส่:

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

แต่ฉันไม่ได้รับข้อผิดพลาดนั้นหากข้อมูลของฉันเป็นสตริง:

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

แต่ฉันต้องการ "เวอร์ชันอาร์เรย์" ของตัวแปรในโค้ด php ฝั่งเซิร์ฟเวอร์ของฉัน

ไฟล์Uncaught TypeError: Illegal invocationนี้อยู่ในไฟล์ "jquery-1.7.2.min.js" ซึ่งถูกบีบอัดทั้งหมดดังนั้นฉันจึงไม่สามารถเข้าใจได้ว่าส่วนใดของโค้ดที่ทำให้เกิดข้อผิดพลาด

มีการตั้งค่าใดบ้างที่ฉันสามารถเปลี่ยนรหัสของฉันเพื่อให้รับข้อมูลเป็นอาร์เรย์เชื่อมโยงได้

คำตอบ:


152

ขอบคุณที่พูดคุยกับSarfrazเราสามารถหาวิธีแก้ปัญหาได้

ปัญหาคือฉันส่งองค์ประกอบ HTML แทนค่าของมันซึ่งจริงๆแล้วเป็นสิ่งที่ฉันต้องการทำ (อันที่จริงในโค้ด php ของฉันฉันต้องการค่านั้นเป็นคีย์ต่างประเทศสำหรับการสืบค้นcitiesตารางของฉันและกรองรายการที่ถูกต้อง)

ดังนั้นแทนที่จะ:

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

มันควรจะเป็น:

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

หมายเหตุ:ตรวจสอบคำตอบของ Jason Kulatunga โดยอ้างถึง JQuery doc เพื่ออธิบายว่าเหตุใดการส่งองค์ประกอบ HTML จึงทำให้เกิดปัญหา


สิ่งที่ฉันกำลังทำ ลืมใช้ .val ()
Usman Shaukat

ฉันกำลังส่งตัวเลือกขององค์ประกอบ html ที่เลือกในตัวแปร ไม่ได้สังเกตว่ามันไม่ใช่ข้อความธรรมดา แต่เป็น html
Sterling Diaz

46

จากเอกสาร jQuery สำหรับprocessData:

processData Boolean
Default: true
โดยค่าเริ่มต้นข้อมูลที่ส่งผ่านไปยังตัวเลือกข้อมูลเป็นอ็อบเจ็กต์ (ในทางเทคนิคสิ่งอื่นที่ไม่ใช่สตริง) จะถูกประมวลผลและเปลี่ยนเป็นสตริงการสืบค้นโดยเหมาะสมกับประเภทเนื้อหาเริ่มต้น "application / x-www -form-urlencoded ". หากคุณต้องการส่ง DOMDocument หรือข้อมูลอื่น ๆ ที่ไม่ได้รับการประมวลผลให้ตั้งค่าตัวเลือกนี้เป็น false

ที่มา: http://api.jquery.com/jquery.ajax

ดูเหมือนว่าคุณจะต้องใช้processDataเพื่อส่งข้อมูลของคุณไปยังเซิร์ฟเวอร์หรือแก้ไขสคริปต์ php ของคุณเพื่อรองรับพารามิเตอร์ที่เข้ารหัสสตริงการสืบค้น


1
นี่คือเรื่องจริง ถ้าฉันได้เห็นมันก่อนที่มันจะชี้ให้ฉันเห็นข้อผิดพลาดที่แท้จริงในรหัสของฉัน ขอบคุณฉันจะเพิ่มหมายเหตุในคำตอบของฉัน
Nadir Sampaoli

25

ฉันได้รับข้อผิดพลาดนี้ขณะโพสต์วัตถุ FormData เนื่องจากฉันตั้งค่าการโทร ajax ไม่ถูกต้อง การตั้งค่าด้านล่างช่วยแก้ปัญหาของฉัน

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

ขอบคุณผู้ชาย. คุณบันทึกวันของฉันไว้และปัญหาของฉันได้รับการแก้ไขด้วยการเพิ่ม "processData: false, contentType: false, cache: false" ในตัว ajax ของฉัน ขอบคุณมาก.
CumaTekin

11

ฉันได้อ่านในเอกสาร JQuery ว่าข้อมูลสามารถเป็นอาร์เรย์ (คู่ค่าคีย์) ฉันได้รับข้อผิดพลาดถ้าฉันใส่:

นี่คือวัตถุไม่ใช่อาร์เรย์:

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

คุณอาจต้องการ:

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

1
มันไม่ได้โยนข้อผิดพลาดนั้นอีกต่อไป แต่ดูเหมือนว่าข้อมูลนี้จะไม่ถูกส่งไปยัง$_GETฝั่งเซิร์ฟเวอร์อาร์เรย์ของฉัน( var_export($_GET)เอาต์พุตarray ( 'undefined' => 'undefined', ))
Nadir Sampaoli

@nadirs: ลองกำหนดประเภทวิธีการใน$.ajaxตัวจัดการของคุณ:type:'get',
Sarfraz

@Sarfraz ผลลัพธ์ก็เหมือนกัน ฝั่งเซิร์ฟเวอร์dataควรพบคีย์ใน GET array ใช่ไหม หรืออาจจะส่งผ่านวิธีการร้องขออื่นต่อไป?
Nadir Sampaoli

@nadirs: สิ่งนี้ได้ผลdata: {foo:'myfoo', bar:'mybar'}ฉันคิดว่าอาจมีปัญหาอื่น ๆ
Sarfraz

@Sarfraz ฉันงี่เง่าผมได้ส่งวัตถุ HTML ในขณะที่ฉันควรจะได้ผ่านความคุ้มค่าe[e.selectedIndex] e[e.selectedIndex].valueหลังจากแก้ไขข้อบกพร่องนี้แล้วสัญกรณ์วัตถุจะทำงานได้ดี
Nadir Sampaoli

7

มีปัญหาเดียวกันเมื่อเร็ว ๆ นี้แก้ไขได้โดยการเพิ่ม traditional: true,


สิ่งนี้ใช้งานได้จริงฉันคิดว่าสำหรับเบราว์เซอร์สมัยใหม่เท่านั้น
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
คำตอบที่ดีเป็นมากกว่าเพียงแค่โค้ด ควรอธิบายว่าเหตุใดจึงตอบคำถามเริ่มต้นและให้ลิงก์ไปยังเอกสารที่เกี่ยวข้องหากมี
JSTL

โดยไม่ต้องสองช่องcontentTypeและprocessDataข้อผิดพลาดจะทำให้การแสดง ฉันเพิ่มสองช่องและมันก็ใช้ได้ผลสำหรับฉัน ฉันคิดว่า op พยายามบ่งบอกถึงสองช่องที่สำคัญ
Ekundayo Blessing Funminiyi

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

7
คำตอบจะมีประโยชน์มากขึ้นหากคุณมีคำอธิบาย
Jon B

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.