单击下拉列表时启用当前禁用的下拉列表

时间:2009-03-08 19:03:53

标签: jquery html events drop-down-menu

以下是方案:我有两个单选按钮,1)面向普通客户,2)业务合作伙伴也有下拉控件,以便X个业务合作伙伴中的一个可以被选中。当选择一个客户类型时,另一个部分会变暗,正常禁用控件并应用CSS以获得禁用的外观。

我正在努力的是,当单选按钮,标签旁边,以及在业务伙伴部分的情况下,单击下拉列表时,该特定部分应该被启用。我发现的是当'Label for'被包围在单选按钮和下拉列表中时,当启用相反的部分时,通过jQuery将其属性禁用= true,实际上单击下拉列表并不是' t启用该部分。此外,对于下拉列表不会触发click事件,我认为这是正确的,因为它的禁用状态设置为true。我已尝试同时使用单选按钮和标签,但禁用的下拉列表似乎是处理黑洞的事件。我正在使用jQuery和Asp.net MVC,但我确信至少在这种情况下MVC的相关性。

单选按钮和标签点击事件将通过IE7中禁用的下拉列表触发,但不会触发Firefox3或Chrome浏览器。

有什么想法吗?

<label for="CustomerRadio">
 <input id="CustomerRadio" checked="checked" 
        name="usertype" type="radio"
        value="Customer" />Customer
</label> 

<label  for="BusinessPartnerRadio">
  <input id="BusinessPartnerRadio"
         name="usertype" type="radio"
         value="BusinessPartner" />Business Partner
    <select id="businessPartnerType" name="businessPartnerType">
      <option selected="selected" value="Builder">Builder</option>
      <option value="InstallDealer">Install Dealer</option>
      <option value="RepairDealer">Repair Dealer</option>
    </select>
</label>

3 个答案:

答案 0 :(得分:4)

你是绝对正确的,被禁用的财产将选择框变成黑洞。即使是普通的浏览器右键单击Firefox上下文菜单也无效。

听起来你的意图是在点击标签容器时重新启用选择框,为了外观的缘故,禁用状态是什么? ..如果是这样,如果使用CSS不透明度使外观禁用了选择框会怎样?

<style type="text/css">
  label.disabled select { opacity: 0.6; filter: alpha(opacity=60); }
</style>

<script type="text/javascript">
  $(function() {
    $('div.formdiv').bind('click',function() {
      $('label.disabled',this).removeClass('disabled');
      $('input:radio',this).attr('checked',true);
      $('div.formdiv').not(this).find('label').addClass('disabled').find('select').attr('selectedIndex',0);
    }).find('label').addClass('disabled');
  });
</script>

<div class="formdiv">
 <label for="CustomerRadio">
  <input id="CustomerRadio" checked="checked" name="usertype" type="radio" value="Customer" />Customer
 </label>
</div>

<div class="formdiv">
 <label for="BusinessPartnerRadio">
  <input id="BusinessPartnerRadio" name="usertype" type="radio" value="BusinessPartner" />Business Partner
 </label>
 <label>
  <select id="businessPartnerType" name="businessPartnerType">
   <option selected="selected" value="Builder">Builder</option>
   <option value="InstallDealer">Install Dealer</option>
   <option value="RepairDealer">Repair Dealer</option>
  </select>
 </label>
</div>

测试页面: http://www.carcomplaints.com/test/motowilliams.html

似乎在FF3&amp ;;我也猜测Chrome浏览器。不幸的是在IE7中(希望我每次说的都有镍),如果你直接点击它,选择框会立即失去焦点.IE内部的东西,与选择对象上的不透明度滤镜相关,似乎。 / p>

补充工具栏...暂时忽略“禁用”选择框问题:即使您在标签上使用“for = ...”语法,我也认为包含多个表单元素无效单个标签标签。如果它有效,也许不是一个好主意。整个想法是点击标签内的任何位置,将焦点放在链接的表单元素上,因此理论上,您的选择框(标签中的第二个表单元素)永远不会获得焦点。 FF3正确处理 - 如果您在不禁用选择框的情况下尝试代码,您将看到问题。

希望有所帮助。第一张海报建议的div叠加可能是要走的路。我以为我只是尝试使用相同的HTML代码替代解决方案,调整以修复每个标签的多个元素元素问题。

答案 1 :(得分:1)

尝试在表单元素的顶部放置一个透明div(使用jQuery这不应该太难),并使div捕获鼠标单击。

答案 2 :(得分:1)

以下是我使用的解决方案here。 基本上,单击周围的包装控件会导致选择框变为enabel和disable。由于您的标签包含所有内容,因此不需要额外的标签(脚本除外)。

<script type="text/javascript">
function setCustomer(Customer)
{
    //disable the business controls
    document.getElementById('BusinessPartnerType').disabled = Customer;

    //set the radio button selection
    document.getElementById('cradio').checked = Customer;
    document.getElementById('bradio').checked = !Customer;
}
</script>

<label for="CustomerRadio" id="CustomerLabel" onclick="setCustomer(true);">
    <input id="CustomerRadio" checked="checked" name="usertype" type="radio" value="Customer" id="cradio" />
    Customer
</label> 

<label for="BusinessPartnerRadio" onclick="setCustomer(false);">
    <input id="BusinessPartnerRadio" name="usertype" type="radio" value="BusinessPartner" id="bradio" />
    Business Partner
    <select id="businessPartnerType" name="businessPartnerType" id="businessPartnerType">
        <option selected="selected" value="Builder">Builder</option>
        <option value="InstallDealer">Install Dealer</option>
        <option value="RepairDealer">Repair Dealer</option>
    </select>
</label>

希望,这样就可以了。