問題描述

我有兩個選擇元素 A 和 B:當 A 的選擇選項更改時,B 的選項必須相應更新。 A 中的每個元素意味着 B 中的許多元素,它是一個 one-to-many 關係 (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 的選項,我在 A 的 onChange 事件中添加了一個函數調用。以下是觸發 onChange 事件 (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 docsdata 可以是一個數組 (鍵值對) 。我收到錯誤,如果我把:

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

相反,如果我的數據是一個字符串,我不會得到這個錯誤:

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

但是我需要”array version” 的變量,在我的 server-side 中的 php 代碼。

Uncaught TypeError: Illegal invocation 位於”jquery-1.7.2.min.js” 文件中,它全部被壓縮,所以我無法弄清楚代碼的哪一部分引起了錯誤。

有什麼設置可以改變我的代碼,以便它接受數據作為關聯數組?

最佳解決方案

感謝與 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 的 answer,它引用了 JQuery doc 來解釋為什麼傳遞 HTML 元素會導致麻煩。

次佳解決方案

從 jquery docs for processData:

processData Boolean
Default: true
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.

看起來您將不得不使用 processData 將數據發送到服務器,或者修改您的 php 腳本來支持 querystring 編碼的參數。

第三種解決方案

I’ve read in JQuery docs that data can be an array (key value pairs). I get the error if I put:

這是對象不是數組:

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

你可能想要:

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

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇