如何根据另一个列表的值填充下拉列表?

时间:2014-04-14 12:15:56

标签: javascript jquery

我想实现与this相同的搜索框,首先,只要用户从第一个保管箱中选择一个选项,第一个下拉列表就会激活,第二个下拉框将被激活并且其列表将被填充

<s:select id="country" name="country" label="Country" list="%{country} onchange="findCities(this.value)"/>

<s:select id="city" name="city" label="Location" list=""/>

7 个答案:

答案 0 :(得分:1)

Jquery链接插件将满足您的目的,

https://plugins.jquery.com/chained/

使用链接 - http://www.appelsiini.net/projects/chained

此插件会链接您的文本框。

答案 1 :(得分:1)

尝试使用此代码,根据您的需要,您必须使用以下选项填充它:

var x;

$('#pu-country').on('change', function () {
    if (this.value != '0') {

        $('#pu-city').prop('disabled', false);
        $('#pu-city').find("option").not(":first").remove();
        $('#pu-location').prop('disabled', true);
        $('#pu-location').val("Choose");

        switch (this.value) {
            case 'A':
                x = '<option value="A.1">A.1</option><option value="A.2">A.2</option><option value="A.3">A.3</option>'
        }
        $('#pu-city').append(x)
    } else {
        $('#pu-location').prop('disabled', true);
        $('#pu-location').val("Choose");
        $('#pu-city').prop('disabled', true);
        $('#pu-city').val("Choose");
    }


});

$('#pu-city').on('change', function () {
    if (this.value != '0') {

        $('#pu-location').prop('disabled', false);
        $('#pu-location').find("option").not(":first").remove();

        switch (this.value) {
            case 'A.1':
                x = '<option value="A.1.1">A.1.1</option><option value="A.1.2">A.1.2</option><option value="A.1.3">A.1.3</option>'
                break;
            case 'A.2':
                x = '<option value="A.2.1">A.2.1</option><option value="A.2.2">A.2.2</option><option value="A.2.3">A.2.3</option>'
                break;
            case 'A.3':
                x = '<option value="A.3.1">A.3.1</option><option value="A.3.2">A.3.2</option><option value="A.3.3">A.3.3</option>'
                break;

        }

        $('#pu-location').append(x)
    } else {
        $('#pu-location').prop('disabled', true);
        $('#pu-location').val("Choose");
    }


});

我还设置了一个演示程序,以查看功能更多的选项。

FIDDLE

答案 2 :(得分:0)

您的代码应该是这样的:

$(country).change(function(){
var l=Document.getElementByID("country"); 
for(i=0;i<=l.length;i++)
    {
    if(l.options[i].selected?)
       {
       text_array=[HERE YOU NEED TO ADD THE CITIES OF l.options[i].text];
       val_array=[HERE YOU NEED TO ADD THE VALUES OF THECITIES OF l.options[i].text];
       }
    }
var c=Document.getElementByID("city"); 
    c.options.text=[];
    c.options.value=[];
//You now should have an empty select.
    c.options.text=text_array ;
    c.options.value=val_array ;
});

我不知道,你使用什么样的数据库,让城市连接到他们的国家,我不能告诉你,把什么放到大写文本中......

答案 3 :(得分:0)

Ciao j888,在这fiddle我尝试重建与您提供链接的网站相同的系统
城市和地区的州数量较少,但概念保持不变 如果要添加新状态,则必须在带有id的select#paese中输入新的html选项 然后你在obj.citta中添加一个带有这个id名称的属性和一个值为city的数组 对于obj.localita来说,你将创建一个数组数组。 您需要的jQuery代码是

<script type="text/javascript">
$(document).ready(function(){
    var obj={
        citta:{ //value is the same of option id
            albania:['Durres','Tirana'],
            austria:['Vienna','innsbruck','Graz'],
            },
        localita:{//for every city create a sub array of places
            albania:[['località Durres1','località Durres 2'],['località Tirana','località Tirana 2']],
            austria:[['località Vienna','località Vienna 2'],['località innsbruck','località innsbruck 2'],['località Graz','località Graz 2','località Graz 3']],
            }   
        }

    $('#paese').on('change',function(){
        $('#località').attr('disabled','disabled').find('option').remove()
        var quale=$(this).find('option:selected').attr('id')
        var arr=obj.citta[quale]
        if(arr){
            $('#citta').removeAttr('disabled')
            $('#citta option.added').remove()
            for(i=0;i<arr.length;i++){
                $('<option class="added">'+arr[i]+'</option>').appendTo('#citta')
                }
            }
        })

    $('#citta').on('change',function(){
        var ind=($(this).find('option:selected').index())-1
        var quale=$('#paese').find('option:selected').attr('id')
        var arr=obj.localita[quale][ind]
        if(arr){
            $('#località').removeAttr('disabled')
            $('#località option.added').remove()
            for(i=0;i<arr.length;i++){
                $('<option class="added">'+arr[i]+'</option>').appendTo('#località')
                }
            }
        })

})
</script>

如果此解决方案不符合您的需求,我会为您浪费时间而道歉。

答案 4 :(得分:0)

您好我已经为yii 1中的许可及其相关主题做了这个。 许可证下拉列表     // php代码            foreach($ subject为$ v){         $ subj。= $ v ['licenseId']。 “:”。 $ v ['subjectId']。 “:”。 $ v ['displayName']。 “;”;       }       Yii :: app() - &gt; clientScript-&gt; registerScript('variables','var subj =“'。$ subj。'”;',CClientScript :: POS_HEAD);     ?&GT;

//javascript code
jQuery(document).ready(function($) {

    //subject. dependent dropdown list based on licnse
    var ty, subjs = subj.split(';'), subjSel = []; //subj register this varible from php it is


  for(var i=0; i<subjs.length -1; i++) { //-1 caters for the last ";"
    ty = subjs[i].split(":");
    subjSel[i] = {licId:ty[0], subjId:ty[1], subjName:ty[2]};
  }

    //dropdown license
  jQuery('#license#').change(function() {
    $('#add').html(''); //clear the radios if any

    val = $('input[name="license"]:checked').val();
    var selectVals = "";
        selectVals += '<select>';

    for(var i=0; i<subjSel.length; i++) {
      if(subjSel[i].licId == val) {
        if(subjSel[i].subjId *1 == 9) continue;
        selectVals += '<option value="'+subjSel[i].subjId+'">'+subjSel[i].subjName+'</option>';
      }
    }
        selectVals += '</select>';

    $("#subject").html(selectVals);
  });
});

答案 5 :(得分:0)

你似乎在问两个问题:

问题1.如何在第一个选择框中选择一个选项时激活一个禁用的选择框(在您的示例中为第二个和第三个选择框)。

答案1: 只需使用disabled = true / false,如下所示......

<select id="country" name="country" label="Country" onchange="document.getElementById('city').disabled=false; findCities(this.value)"/> <select id="city" name="city" label="Location" disabled=true/>

注意:我更改了“s:select”以“select”,因为您的问题没有引用或标记使用此语法的Struts框架。

问题2:当在第一个选择框中进行选择时,如何填充第二个选择框。

答案2:有很多方法可以做到这一点,选择取决于您使用数据填充列表的位置。对于Rentalcars示例,如果您选择了Barbados,浏览器会向“http://www.rentalcars.com/AjaxDroplists.do;jsessionid=5DCBF81333A88F37BC7AE15D21E10C41.node012a?country=Barbados&wrapNonAirports=true”发送ajax GET请求,请点击此链接,您将看到该请求发回的内容。这个'.do'地址是与我上面提到的Struts框架一起使用的类型的服务器端文件。

一种更常规的方法,将包含在function findCities(country)中,将向PHP脚本发送一个AJAX请求,该脚本查询数据库并将一组地名发送回浏览器。 AJAX javascript代码包含有关如何处理响应的说明。如果不了解您希望存储列表的位置的更多信息,那么举一个这样的例子很可能没用。

或者,整个地方列表可以作为数组包含在javascript脚本中(如上面的Devima所示),在服务器上的文本文档中以逗号分隔值的形式包含,或者您可以将其保存到浏览器数据库中像WebSQL或IndexedDB,如果离线使用会很有用。

当你获得列表时,可能是一个值数组,你可以将数组保存为变量,例如。 var cities=result(在简单的ajax请求的情况下)。然后,您需要遍历cities,例如

for (var i = 0; i < cities.length; i++){
var place=cities[i];//an individual city name
document.getElementById("city").innerHTML+="<option value='" + place + "'>" + place + "</option>";//adds an 'option' with the value being the city name and the text you see being the city name
}

答案 6 :(得分:0)

IMO这是基本案例AngularJS旨在完全缓解。看看吧!