Json级联下拉列表

时间:2015-03-03 08:02:33

标签: javascript jquery json

我正在尝试使用JSON数据设置级联下拉列表。我有点工作,但需要一些帮助,让第二层按预期工作。目前它似乎正在抓住数组中的数字。

理想情况下,对于我的第二层,我想在下拉列表中显示文本作为选项文本,并且我想使用json中的id字段作为选项的值。

var data = {
            "Crime":[
                {"id":"1","text":"Number of police"},
                { "id":"2","text":"Number of crimes"} 
                    ],
            "Health":[
                {"id":"3","text":"Number of doctors"},
                {"id":"4","text":"Number of hospital visits"},
                {"id":"5","text":"Number of nurses"} 
                    ],
                }

我有jsfiddle显示我到目前为止所拥有的内容。

很高兴使用javascript / jquery的任何组合效果最佳。

2 个答案:

答案 0 :(得分:1)

您使用for..in的方式似乎不正确。如果指向集合(在这种情况下为question)不是简单数组,则data[this.value]变量将不包含整个值。相反,它将包含第一行,第二行的索引,依此类推。我请求您阅读本文以获得更深入的理解:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

这一行

questionSel.options[questionSel.options.length] = new Option(question, question);

必须以这种方式阅读

questionSel.options[questionSel.options.length] = new Option(
                                      data[this.value][question].text, 
                                      data[this.value][question].id);

在进行此项更改后,这里有一个更新的小提琴:

http://jsfiddle.net/tc1f3kup/2/

答案 1 :(得分:0)

请试试这个

 var data = {
        "Crime":[
            {"id":"1","text":"Number of police"},
            { "id":"2","text":"Number of crimes"} 
                ],

        "Health":[
            {"id":"3","text":"Number of doctors"},
            {"id":"4","text":"Number of hospital visits"},
            {"id":"5","text":"Number of nurses"} 

                ],

            }
 window.onload = function () {
        var themeSel = document.getElementById("theme"),
        questionSel = document.getElementById("questions");
        for (var theme in data) {
            themeSel.options[themeSel.options.length] = new Option(theme, theme);
        }
        themeSel.onchange = function () {
            questionSel.length = 1; // remove all options bar first
            if (this.selectedIndex < 1) return; // done                 
                for(var i=0;i<data[this.value].length;i++)
                {                        
                    questionSel.options[questionSel.options.length] = new Option(data[this.value][i].text, data[this.value][i].id);
                }



        }
}
工作小提琴 http://jsfiddle.net/tc1f3kup/3/