0

好的,我花了很多时间查看示例,但找不到对我的情况有足够帮助的示例。我有一个 JSON 文件,对此示例进行了简化:

{
 "Company":[
    {
        "Position": "Manager",
        "Name": {
                            "11": "joe",
                            "12": "bill",
                            "166": "John"
                            }
    },
{

        "Position": "Tech",
        "Name": {
                            "11": "Bob",
                            "12": "Cindy",
                            "166": "Karl"
                            }
    },
{

        "Position": "Sales",
        "Name": {
                            "11": "Sam",
                            "12": "Ron",
                            "166": "Sara"
                            }
    }
]}

我正在尝试创建 2 个选择框。当用户选择第一个位置框时,它将使用属性(名称)自动填充第二个框。所以这是我到目前为止所拥有的:

<select id="job"></select>
<select id="name"></select>

和代码:

$select = $('#job');
$select2 = $('#name');

$.ajax({
    url: 'factors.json',
    dataType: 'JSON',
    success: function(data) {

        $select.html('');
        $.each(data.Company, function(key, val) {
            $select.append('<option id="' + key + '">' + val.Position + '</option>');



            $("#job").change(function() {
                $.each(val.Name, function(key2, val2) {
                    $select2.append('<option id="' + key2 + '">' + val2 + '</option>');
                })
            })
        })
    },
});​

此代码将使用每个位置的所有名称自动填充第二个框。我似乎无法弄清楚如何用每个唯一对象的名称填充它。谢谢你的帮助!

4

2 回答 2

1

这应该可以解决问题。

$.each(data.Company, function(key, val) {
    $select.append('<option id="' + key + '">' + val.Position + '</option>');
});



$("#job").change(function(e) {
    $select2.empty();
    $index = $(this).children(':selected').attr('id');
        for (var k in data.Company[$index].Name) {
            $select2.append('<option id="' + k + '">' + data.Company[$index].Name[k] + '</option>');
        }
});
于 2012-11-07T15:26:51.737 回答
1

尝试这样的事情。你真的应该为你的选择拥有一个价值属性。我在选项中添加了一个 data-id attr,以便我可以使用它来存储位置的索引。

$.each(data.Company, function(i, v) {
    // create option with value as index - makes it easier to access on change
    var options = $('<option/>', {value: v.Position, text: v.Position}).attr('data-id',i);    
    // append the options to job selectbox
    $('#job').append(options);
});

// bind change event
$('#job').change(function() {
    // cache this
    var $el = $(this);
    // get data-id attr from selected option
    var id = $('option:selected',this).data('id');
    // empty select
    $('#name').empty();
    // get name values for selected option
    $.each(data.Company[id].Name, function(i, v) {
        // create option elements
        var options = $('<option/>', {value: v, text: v});
        // append the options to name selectbox
        $('#name').append(options);
    });    
}).change();// trigger change() on page load to fill name selectbox​

http://jsfiddle.net/wirey00/xYX8z/

于 2012-11-07T16:02:24.867 回答