2012-08-10 63 views
1

我将有3 <select multiple="multiple">,我想用JSON数组填充它们。如何处理多个选择下拉列表 - JQuery

{ 
"folders": [ 
    { 
     "name": "folderName1", 
     "files": [ 
      { 
       "name": "filesName1", 
       "item": [ 
        { 
         "name": "itemName1" 
        } 
       ] 
      } 
     ] 
    }, 
    { 
     "name": "folderName2", 
     "files": [ 
      { 
       "name": "fileName2", 
       "item": [ 
        { 
         "name": "itemName2" 
        } 
       ] 
      } 
     ] 
    } 
] 
} 

而且我想用ALL文件夹,以填补第一select - 名称。

然后使用第一个选择框中的选定值过滤其他selects的内容。例如,当我在第一个选择中选择foldername1时,我想在第二个选择中仅显示选项fileName1,在第三个select中显示itemName1;

是否有可能实现使用jQuery?

到现在为止,我有以下:http://jsfiddle.net/dvMv9/26/

+0

是的,它是可能的。你到底有什么问题? – 2012-08-10 10:15:36

回答

1

这是工作代码,并在小提琴的链接。

http://jsfiddle.net/yPDGA/

<select multiple="multiple" id="sel_1"></select> 
<select multiple="multiple" id="sel_2"></select> 
<select multiple="multiple" id="sel_3"></select> 

$(document).ready(function(){ 
    var my_json = { 
    "folders": [ 
     { 
      "name": "folderName1", 
      "files": [ 
       { 
        "name": "filesName1", 
        "item": [ 
         { 
          "name": "itemName1" 
         } 
        ] 
       } 
      ] 
     }, 
     { 
      "name": "folderName2", 
      "files": [ 
       { 
        "name": "fileName2", 
        "item": [ 
         { 
          "name": "itemName2" 
         } 
        ] 
       } 
      ] 
     } 
    ] 
    }; 

    var i, html = ""; 
    for (i = 0; i < my_json.folders.length; i += 1) { 
     html += '<option value="' + my_json.folders[i].name + '">' + my_json.folders[i].name + '</option>'; 
    } 
    $("#sel_1").html(html); 

    $("#sel_1").change(function() { 
     var html = "", i, j; 
     for (i = 0; i < my_json.folders.length; i += 1) { 
      if (my_json.folders[i].name === $(this).attr("value")) { 
       for (j = 0; j < my_json.folders[i].files.length; j += 1) { 
        html += '<option value="' + my_json.folders[i].files[j].name + '">' + my_json.folders[i].files[j].name + '</option>'; 
       } 
       $("#sel_2").html(html); 
       $("#sel_3").html(''); 
       return; 
      } 
     } 

    }); 

    $("#sel_2").change(function() { 
     var html = "", i, j, k, sel_1_value = $("#sel_1").attr("value"); 
     for (i = 0; i < my_json.folders.length; i += 1) { 
      if (my_json.folders[i].name === sel_1_value) { 
       for (j = 0; j < my_json.folders[i].files.length; j += 1) { 
        if (my_json.folders[i].files[j].name === $(this).attr("value")) { 
         for (k = 0; k < my_json.folders[i].files[j].item.length; k += 1) { 
          html += '<option value="' + my_json.folders[i].files[j].item[k].name + '">' + my_json.folders[i].files[j].item[k].name + '</option>'; 
         } 
        } 
       } 
       $("#sel_3").html(html); 
       return; 
      } 
     } 

    }); 
}); 
1

这可能是一个办法的事,而是必须实现的。无论如何,这是一个开始点:

var json = '{"folders":[{"name":"folderName1","files":[{"name":"filesName1","item":[{"name":"itemName1"}]}]},{"name":"folderName2","files":[{"name":"fileName2","item":[{"name":"itemName2"}]}]}]}'; 

var jsonObject= jQuery.parseJSON(json); 

var folders = jsonObject.folders; 

for(var i=0; i< folders.length; i++) { 
    $('#folders').append("<option>"+folders[i].name+"</option>"); 
} 

$('#folders').on('change', function(){ 

    $('#files option').remove(); 
    $('#items option').remove(); 

    var $this = $(this).val()[0]; 
    for(k in folders) { 
     if(folders[k].name == $this){ 
      //Here could be other loop 
      var $file = folders[k].files[0].name; 
      var $item = folders[k].files[0].item[0].name; 
      $('#files').append("<option>"+$file+"</option>"); 
      $('#items').append("<option>"+$item+"</option>"); 
     } 
    } 


}); 
1

下面将做你想做的,

看看更新的fiddle

var jsonObject= jQuery.parseJSON(json); 

var folders = jsonObject.folders; 
var curFolderSelection; 
var curFileSelection; 

for(var i=0; i< folders.length; i++) { 
    $('#folders').append("<option>"+folders[i].name+"</option>");  
} 

$('#folders').on('change', function(){ 
    curFolderSelection = $(this).val(); 
    for(var i=0; i< folders.length; i++) { 
     if(folders[i].name == curFolderSelection){ 
      curFileSelection = folders[i].files; 
     }         
    } 
    $('#files').html(''); 
    $('#items').html(''); 
    for(var j=0; j < curFileSelection.length; j ++) {   
     $('#files').append("<option>"+curFileSelection[j].name+"</option>"); 
     var items = curFileSelection[j].item; 
     for(var k=0; k< items.length; k++) { 
      $('#items').append("<option>"+items[k].name+"</option>"); 
     }    
    }  
}); 

好了,更新的代码与细微的变化

的更新了fiddle

$('#folders').on('change', function() { 
    //alert(this.val); 
    $('#files').html(''); 
    $('#items').html(''); 
    curFolderSelection = $('#folders option:selected'); 
    curFolderSelection.each(function() { 
     for (var i = 0; i < folders.length; i++) { 
      if (folders[i].name == $(this).val()) { 
       curFileSelection = folders[i].files; 
      } 
     } 

     for (var j = 0; j < curFileSelection.length; j++) { 
      $('#files').append("<option>" + curFileSelection[j].name + "</option>"); 
      var items = curFileSelection[j].item; 
      for (var k = 0; k < items.length; k++) { 
       $('#items').append("<option>" + items[k].name + "</option>"); 
      } 
     } 
    }); 
});​ 
+0

我可以以某种方式将其更改为支持多种选择?例如,如果我选择folder1和2,它将显示所有内容 – glarkou 2012-08-10 12:05:59

+0

如果您在第二个“select”框中选择任何内容,则不起作用,因为第一个选择器中只有一个onchange侦听器。 – glarkou 2012-08-10 12:25:09

+0

@salamis看看我更新的代码 – 2012-08-10 14:24:44

1

您可以拆分代码并将循环放入不同的函数中。

var json = '{"folders":[{"name":"folderName1","files":[{"name":"filesName1","item":[{"name":"itemName1"}]}]},{"name":"folderName2","files":[{"name":"fileName2","item":[{"name":"itemName2"}]}]}]}'; 

var jsonObject = jQuery.parseJSON(json); 
var folders = jsonObject.folders; 

var select1 = document.getElementById("folders"); 
var select2 = document.getElementById("files"); 
var select3 = document.getElementById("items"); 

function updateSelect1() { 
    $(select1).empty(); 
    for (var i = 0; i < folders.length; i++) { 
     $(select1).append("<option value='" + i + "'>" + folders[i].name + "</option>").val(0); 
    } 
} 

function updateSelect2() { 
    $(select2).empty(); 
    var files = folders[select1.value].files; 
    for (var j = 0; j < files.length; j++) { 
     $(select2).append("<option value='" + j + "'>" + files[j].name + "</option>").val(0); 
    } 
    updateSelect3(); 
} 

function updateSelect3() { 
    $(select3).empty(); 
    var items = folders[select1.value].files[select2.value].item; 
    for (var k = 0; k < items.length; k++) { 
     $(select3).append("<option value='" + k + "'>" + items[k].name + "</option>").val(0); 
    } 
} 

$(select1).change(updateSelect2); 
$(select2).change(updateSelect3); 

updateSelect1(); 
updateSelect2(); 
updateSelect3(); 

演示:http://jsfiddle.net/diode/dvMv9/35/