2011-10-08 219 views
13

根据另一个选择下拉选项,我需要在一个选择下拉菜单中显示/隐藏选项。当选择其他选择下拉选项时,jQuery显示/隐藏选项下拉菜单

下面的代码显示了我想实现的目标。

如果'column_select'选择菜单选项设置为'1列',那么'layout_select'选择菜单只能显示'none'选项。

如果'column_select'选择菜单选项设置为'2 column',那么'layout_select'选择菜单只能显示'layout 1'和'layout 2'选项。

如果“column_select”选择菜单选项被设置为“3列”则“layout_select”选择菜单必须只显示“布局3”,“4布局”和“布局5”选项。

<select name="column_select" id="column_select"> 
    <option value="col1">1 column</option> 
    <option value="col2">2 column</option> 
    <option value="col3">3 column</option> 
</select> 

<select name="layout_select" id="layout_select"> 
    <!--Below shows when '1 column' is selected is hidden otherwise--> 
    <option value="col1">none</option> 

    <!--Below shows when '2 column' is selected is hidden otherwise--> 
    <option value="col2_ms">layout 1</option> 
    <option value="col2_sm">layout 2</option> 

    <!--Below shows when '3 column' is selected is hidden otherwise--> 
    <option value="col3_mss">layout 3</option> 
    <option value="col3_ssm">layout 4</option> 
    <option value="col3_sms">layout 5</option> 
</select> 

到目前为止,我所尝试过的一切都失败了......我是jQuery的新手。如果有人可以请帮助它将不胜感激。谢谢!

回答

26

尝试 -

$("#column_select").change(function() { 
    $("#layout_select").children('option').hide(); 
    $("#layout_select").children("option[value^=" + $(this).val() + "]").show() 
}) 

如果你要使用此解决方案你需要隐藏所有的元素从一个与你的文档中的“无”值分开。功能齐全 -

$(document).ready(function() { 
    $("#layout_select").children('option:gt(0)').hide(); 
    $("#column_select").change(function() { 
     $("#layout_select").children('option').hide(); 
     $("#layout_select").children("option[value^=" + $(this).val() + "]").show() 
    }) 
}) 

演示 - http://jsfiddle.net/Mxkfr/2

编辑

我也许能得到这个得意忘形了一点,但这里是一个使用原来的选择列表中选择一个高速缓存中的另一个例子确保在'column_select'列表更改后,'layout_select'列表被完全重置/清除(包括'none'选项) -

$(document).ready(function() { 
    var optarray = $("#layout_select").children('option').map(function() { 
     return { 
      "value": this.value, 
      "option": "<option value='" + this.value + "'>" + this.text + "</option>" 
     } 
    }) 

    $("#column_select").change(function() { 
     $("#layout_select").children('option').remove(); 
     var addoptarr = []; 
     for (i = 0; i < optarray.length; i++) { 
      if (optarray[i].value.indexOf($(this).val()) > -1) { 
       addoptarr.push(optarray[i].option); 
      } 
     } 
     $("#layout_select").html(addoptarr.join('')) 
    }).change(); 
}) 

演示 - http://jsfiddle.net/N7Xpb/1/

+0

谢谢!这似乎工作,但有一个小问题...... 当从“column_select”选择选项时,“layout_select”中当前选定的选项保持不变。有没有办法改变选项? – Nick

+0

伟大的我实现了你的最新更新,它运作良好。我遇到的一个问题是刷新后不能保证选择正确的选项。页面刷新后,“#layout_select”将恢复到第1个选择。我想知道我是否可以再强加一点,告诉我如何在刷新时选择正确的选项? – Nick

+0

在什么情况下屏幕刷新?它是在表单发布之后吗? – ipr101

1
// find the first select and bind a click handler 
$('#column_select').bind('click', function(){ 
    // retrieve the selected value 
    var value = $(this).val(), 
     // build a regular expression that does a head-match 
     expression = new RegExp('^' + value), 
     // find the second select 
     $select = $('#layout_select); 

    // hide all children (<option>s) of the second select, 
    // check each element's value agains the regular expression built from the first select's value 
    // show elements that match the expression 
    $select.children().hide().filter(function(){ 
     return !!$(this).val().match(expression); 
    }).show(); 
}); 

(这远非完美,但应该让你有...)

7

如何:

更新

$("#column_select").change(function() { 
    $("#layout_select") 
     .find("option") 
     .show() 
     .not("option[value*='" + this.value + "']").hide(); 

    $("#layout_select").val(
     $("#layout_select").find("option:visible:first").val()); 

}).change(); 

(假设第三option应该有一个值col3

实施例:http://jsfiddle.net/cL2tt/

注:

  • 使用.change()事件定义的事件处理程序,执行时的select#column_select的值发生变化。
  • .show()全部option s在第二个select
  • .hide()所有option S IN第二selectvalue不包含所选选项的valueselect#column_select,使用attribute contains selector
+0

谢谢!像上面这似乎工作,但有一个小问题。 当从“column_select”中选择新选项时,“layout_select”中当前选定的选项保持不变。有没有办法改变选项? – Nick

+0

是的。看我更新的例子。对不起,错误! –

+0

非常感谢! – Nick

2

Initialy两个下拉具有相同的选项,在firstdropdown您选择的选项是隐藏在seconddropdown“值”是自定义属性是独特的。

$(".seconddropdown option").each(function() { 
    if(($(this).attr('value')==$(".firstdropdown option:selected").attr('value'))){ 
     $(this).hide(); 
     $(this).siblings().show(); 
    } 
}); 
2

痘痘或许是晚期,但我会建议

$(document).ready(function() { 
    var layout_select_html = $('#layout_select').html(); //save original dropdown list 

    $("#column_select").change(function() { 
     var cur_column_val = $(this).val(); //save the selected value of the first dropdown 
     $('#layout_select').html(layout_select_html); //set original dropdown list back 
     $('#layout_select').children('option').each(function(){ //loop through options 
     if($(this).val().indexOf(cur_column_val)== -1){ //do your conditional and if it should not be in the dropdown list 
      $(this).remove(); //remove option from list 
     } 
    }); 
}); 
0

而在2016年.....我这样做(工作在所有浏览器,并且不产生“非法” HTML)。

对于显示/隐藏不同值的下拉选择,将该值添加为数据属性。

<select id="animal"> 
    <option value="1" selected="selected">Dog</option> 
    <option value="2">Cat</option> 
</select> 
<select id="name"> 
    <option value=""></option> 
    <option value="1" data-attribute="1">Rover</option> 
    <option value="2" selected="selected" data-attribute="1">Lassie</option> 
    <option value="3" data-attribute="1">Spot</option> 
    <option value="4" data-attribute="2">Tiger</option> 
    <option value="5" data-attribute="2">Fluffy</option> 
</select> 

然后在你的jQuery更改事件添加到第一个下拉列表中选择过滤第二个下拉。

$("#animal").change(function() { 
    filterSelectOptions($("#name"), "data-attribute", $(this).val()); 
}); 

而神奇的是这个小小的jQuery实用程序。

function filterSelectOptions(selectElement, attributeName, attributeValue) { 
if (selectElement.data("currentFilter") != attributeValue) { 
    selectElement.data("currentFilter", attributeValue); 
    var originalHTML = selectElement.data("originalHTML"); 
    if (originalHTML) 
     selectElement.html(originalHTML) 
    else { 
     var clone = selectElement.clone(); 
     clone.children("option[selected]").removeAttr("selected"); 
     selectElement.data("originalHTML", clone.html()); 
    } 
    if (attributeValue) { 
     selectElement.children("option:not([" + attributeName + "='" + attributeValue + "'],:not([" + attributeName + "]))").remove(); 
    } 
} 

}

这个小宝石跟踪当前的过滤器,如果不同的是恢复原来的选择(所有项目),然后删除过滤项目。如果过滤器项目为空,我们会看到所有项目。

相关问题