我需要在一个选择下拉列表中显示/隐藏选项,具体取决于另一个选择下拉选项。
下面的代码显示了我想要实现的目标。
如果'column_select'选择菜单选项设置为'1列',则'layout_select'选择菜单必须仅显示'none'选项。
如果'column_select'选择菜单选项设置为'2列',则'layout_select'选择菜单必须仅显示'布局1'和'布局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的新手。如果有人可以请求帮助,将不胜感激。谢谢!
答案 0 :(得分:32)
尝试 -
$("#column_select").change(function () {
$("#layout_select").children('option').hide();
$("#layout_select").children("option[value^=" + $(this).val() + "]").show()
})
如果您打算使用此解决方案,则需要隐藏除document.ready函数中的'none'值之外的所有元素。
$(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
修改强>
我可能会对此有所了解,但这是另一个使用原始选择列表选项的缓存来确保'layout_select'列表完全重置/清除(包括'none'选项)的示例'column_select'列表更改后 -
$(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();
})
答案 1 :(得分:8)
怎么样:
(的更新强>)
$("#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
中的所有select
。.hide()
option
中所有select
的{{1}} value
中value
未包含select#column_select
中所选选项的{{1}} attribute contains selector。答案 2 :(得分:4)
2016年.....我这样做(适用于所有浏览器,不会创建&#34;非法&#34; 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();
}
}
}
这个小宝石跟踪当前过滤器,如果不同,它会恢复原始选择(所有项目),然后删除过滤后的项目。如果过滤条目为空,我们会看到所有项目。
答案 3 :(得分:2)
最初,两个下拉列表都有相同的选项,您在firstdropdown中选择的选项隐藏在seconddropdown中。“value”是自定义属性,它是唯一的。
$(".seconddropdown option" ).each(function() {
if(($(this).attr('value')==$(".firstdropdown option:selected").attr('value') )){
$(this).hide();
$(this).siblings().show();
}
});
答案 4 :(得分: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
}
});
});
答案 5 :(得分: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();
});
(这远非完美,但应该让你到那里......)