2010-06-28 123 views
0

是否可以在选择列表中禁用/不可见项目? 我想要完成的是,取决于一些复选框,如果它们被选中,这些字段应该出现在下拉列表中。但是,我确实有永久应该在下拉菜单中的限定字段,它应该都是按顺序排列的。可能禁用/使项目在选择列表中不可见?

复选框:

<table class="Fields"><tr> 
    <td><%=Html.CheckBox("Field1", Model.DisplayField1, new { value = "Field1" })%> Field 1</td> 
    <td><%=Html.CheckBox("Field2", Model.DisplayField2, new { value = "Field2" })%> Field 2</td> 
    <td><%=Html.CheckBox("Field3", Model.DisplayField3, new { value = "Field3" })%> Field 3</td> 
</tr><tr> 
    <td><%=Html.CheckBox("Field4", Model.DisplayField4, new { value = "Field4" })%> Field 4</td> 
    <td><%=Html.CheckBox("Field5", Model.DisplayField5, new { value = "Field5" })%> Field 5</td> 
    <td><%=Html.CheckBox("Field6", Model.DisplayField6, new { value = "Field6" })%> Field 6</td> 
</tr></table> 

下拉:

<table cellpadding="0" cellspacing="0"> 
    <tr> 
     <td>Sort 1</td> 
     <td><%= Html.DropDownList("drpSortColumn1", (SelectList)ViewData["SortColumns"])%></td> 
    </tr> 
</table> 

下拉包含了所有的checkboxfields +一些额外的字段,总是应该在那里。因此,我可以动态删除所有并添加取决于如果它被检查或不。 我需要在UI中执行此操作。莫名其妙地理想jquery。 那么对此有什么好处呢?有禁用选项吗?否则会是一种选择?

谢谢!

// MRW

编辑: 我试着这样做:

$('#drpSortColumn1 option[value=' + val + ']').hide(); 

,但似乎并没有工作了。我不知道是不是可以隐藏一个选项,或者如果我做错了。

回答

0

最后我做这个:

$(document).ready(function() { 
    $('.Fields input[type=checkbox]:checked').click(function() { 

     $('#drpSortColumn1').children().remove(); 

     jQuery.each(fields, function(val, name) { 
      $('#drpSortColumn1').append('<option value="' + val + '">' + name + '</option>') 
     }); 

     $('.Fields input:checkbox:not(:checked)').each(function() { 
      $('#drpSortColumn1 option[value=' + $(this).val() + ']').remove(); 
     }); 
    }) 
}); 

因此,我存储一个Json对象,其中包含所有原始字段,并在每个复选框单击时,从下拉列表中删除所有项目,并重新生成所有项目。然后根据未选中的复选框删除下拉列表中的值。

0

看看这里,我想这就是你要找的内容:jQuery disable SELECT options based on Radio selected (Need support for all browsers)

你可以有你自己的订单,只要在合适的条件,我认为它应该统治;)

干杯^^

编辑:好吧,这不是你的情况非常方便所以这里有一些线索:

  • 尝试使用尽可能d禁用属性由CuSS规定,这将是最低成本和难以设置。但它有一个主要的缺点,即该选项不能被隐藏,即使它不再可选。显示:没有选项只适用于我记得的FF。

  • 如果你准备编写大量的代码,你可以删除并通过影响他们的ID来记住他们为了他们像

    ... ... 等字段添加..

你必须有两次相同的选择,一个在显示:none div,“默认”选择包含所有选项,我们不会操纵。

然后如果你想隐藏一个选项,你可以在第一个选择中删除它。当你想把它放回去,并创建一个带两个参数的函数插入选项:一个用于标识select(select1,select2,select3 ....不知道你是怎么得到的),另一个用于行)你想插入(数组似乎是最好的)。

然后你在正确的选择中正确的位置克隆选择的,它应该做的伎俩,至少这是我看到的唯一的解决方案,如果你不想一直重新创建它,并保持正确订购。告诉我,如果这还不清楚,但我希望这有助于;)

+0

不是真的,因为该示例似乎与预定义的列表一起使用,应该启用和禁用。我可以有多达20个可选字段,并且都可以打开或关闭(+我的manditory字段)。那意味着我需要用每一个可能的解决方案来创建词典?! – MrW 2010-06-28 08:58:20

+0

这就是我正在考虑的,因为无论如何,如果你想保持正确的顺序,你必须做这样的事情。隐藏()确实不适用于选项。我不确定是否有“轻量级”解决方案。但是如果有人有一个更好的主意,(禁用属性不是完全跨浏览器,但如果你不需要IE6的支持,它可以做到这一点,因为该选项将不可选)。 – 2010-06-28 09:06:18

+0

那么,目前在总共25个领域中进行了简要介绍,而且很可能在未来更多,这将会或多或少地不可能保持这种方式。恐怕这不是一个选择。也听起来像这样会很慢,检查我现在有什么组合,然后加载正确的值。 – MrW 2010-06-28 10:19:32

1

变化:

$('#drpSortColumn1 option[value=' + val + ']').hide(); 
$('#drpSortColumn1 option[value=' + val + ']').show(); 

到:

$('#drpSortColumn1 option[value=' + val + ']').attr('disabled','disabled'); 
$('#drpSortColumn1 option[value=' + val + ']').attr('disabled',''); 

或:

$('#drpSortColumn1 option[value=' + val + ']').attr('disabled',true); 
$('#drpSortColumn1 option[value=' + val + ']').attr('disabled',false); 
+0

我试过了残疾人,但问题在于它无论如何都出现在列表中。我基本上完成了这个工作:存储一个包含所有原始项目的Json对象,并为每个复选框检查,清除下拉列表,重新生成它,然后删除未选中的值。 – MrW 2010-06-28 13:32:08

+0

这将消耗更多,并且如果用户已经选择了包含在下一个新选择中的选择,则用户将失去他所选择的选项。跳你明白,对不起我的英语 – CuSS 2010-06-28 14:17:53

相关问题