首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript jQuery依赖下拉列表

JavaScript jQuery依赖下拉列表
EN

Stack Overflow用户
提问于 2015-05-20 10:10:31
回答 1查看 4.2K关注 0票数 3

我有这个相关的下拉框代码,在其中您选择第一个选择(主板)和其他选择(ram和视频板)将显示取决于第一个选择。

代码语言:javascript
复制
$(function(){

  var $cat = $("#motherboard"),
      $subcat = $(".subcat");

  $cat.on("change",function(){
    var _rel = $(this).val();
    $subcat.find("option").attr("style","");
    $subcat.val("");
    if(!_rel) return $subcat.prop("disabled",true);
    $subcat.find("[rel~='"+_rel+"']").show();
    $subcat.prop("disabled",false);
  });
});
代码语言:javascript
复制
.subcat option{
  display:none;
}

.subcat option.label{
  display:block;
}

/* useless template */

div{
  margin-bottom:10px;
  float:left;
  width:100%;
}
label{
  float:left;
  width:200px;
  margin-left:20px
}
p{
  padding:5px 20px;
  background-color:#f1f1f1;
  float:left;
  border:solid 1px #ccc;
  color:#333;
  text-transform:uppercase;
  margin: 20px 0 30px;
}
body{
  font-family:arial;
  font-size:14px;
}
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h1>Made your PC:</h1>

<div>
  <label>Select motherboard: </label><select id="motherboard" name="motherboard">
  <option class="label" value>Select Motherboard</option>
  <!-- Home Ware -->
  <option value="AS1">ASUS RAMPAGE V EXTREME</option>
  <option value="AS2">ASUS ATX DDR3 2600 LGA</option>
  <option value="GB1">Gigabyte AM3+</option>
  <option value="MSI1">MSI ATX DDR3 2600 LGA 1150</option>

  </select>
</div>
<p><strong>Only compatible components will show.</strong></p>
<div>
  <label>Select RAM: </label> <select disabled="disabled" class="subcat" id="RAM" name="RAM">
  <option class="label" value>RAM Memory</option>
  <option rel="AS1 AS2 GB1" value="KI1">Kingston Value RAM</option>
  <option rel="AS1 AS2 MSI1" value="P5KPL">P5KPL-AM SE</option>
  <option rel="MSI1 GB1" value="960GM">960GM-VGS3 FX </option>
  </select>
</div>

<div>
  <label>Select Video Board: </label> <select disabled="disabled" class="subcat" id="video-card" name="video-card">
  <option class="label" value>Video Card</option>
  <option rel="MSI1 AS2" value="EVGA8400">EVGA GeForce 8400 GS</option>
  <option rel="AS1" value="XFXAMD">XFX AMD Radeon HD 5450</option>
  <option rel="MSI1 GB1" value="GTX750Ti">EVGA GeForce GTX 750Ti SC</option>
  </select>
</div>

您也可以在这个小提琴上看到它。

我如何添加第一个选项,让我们说“处理器”,主板将取决于,然后其他一切,就像它,取决于主板。

现在它是:母兽如何制作:处理器->主板-主板

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-20 11:23:06

您可以通过以下方式来实现这一点:

  • 为处理器下拉列表添加一个新节
  • 向主板添加一个rel属性,该属性将包含处理器ID
  • 指示主板现在是一个子类别(添加class="subcat")
  • 复制主板的onchange代码,但将其应用于处理器,并针对主板而不是子类别

守则是这样的:

代码语言:javascript
复制
$(function(){

  // add a supercategory for the processor
  var $supcat = $("#processor"),
      $cat = $("#motherboard"),
      $subcat = $(".subcat");
  
  // duplicate the code for the processor -> motherboard
  $supcat.on("change",function(){
    var _rel = $(this).val();
    $cat.find("option").attr("style","");
    $cat.val("");
    if(!_rel) return $cat.prop("disabled",true);
    $cat.find("[rel~='"+_rel+"']").show();
    $cat.prop("disabled",false);
  });
  
  $cat.on("change",function(){
    var _rel = $(this).val();
    $subcat.find("option").attr("style","");
    $subcat.val("");
    if(!_rel) return $subcat.prop("disabled",true);
    $subcat.find("[rel~='"+_rel+"']").show();
    $subcat.prop("disabled",false);
  });
});
代码语言:javascript
复制
.subcat option{
  display:none;
}

.subcat option.label{
  display:block;
}

/* useless template */

div{
  margin-bottom:10px;
  float:left;
  width:100%;
}
label{
  float:left;
  width:200px;
  margin-left:20px
}
p{
  padding:5px 20px;
  background-color:#f1f1f1;
  float:left;
  border:solid 1px #ccc;
  color:#333;
  text-transform:uppercase;
  margin: 20px 0 30px;
}
body{
  font-family:arial;
  font-size:14px;
}
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h1>Made your PC:</h1>

<div>
  <label>Processeor: </label><select id="processor" name="processor">
  <option class="label" value>Select Processor</option>
  <!-- Home Ware -->
  <option value="P1">Processor 1</option>
  <option value="P2">Processor 2</option>
  <option value="P3">Processor 3</option>
  <option value="P4">Processor 4</option>

  </select>
</div>

<p><strong>Only compatible components will show.</strong></p>
<div>
  <label>Select motherboard: </label><select id="motherboard" name="motherboard" class="subcat" disabled="disabled">
  <option class="label" value>Select Motherboard</option>
  <!-- Home Ware -->
  <option rel="P1 P2" value="AS1">ASUS RAMPAGE V EXTREME</option>
  <option rel="P2 P3" value="AS2">ASUS ATX DDR3 2600 LGA</option>
  <option rel="P1 P3 P4" value="GB1">Gigabyte AM3+</option>
  <option rel="P2 P4" value="MSI1">MSI ATX DDR3 2600 LGA 1150</option>

  </select>
</div>
<div>
  <label>Select RAM: </label> <select disabled="disabled" class="subcat" id="RAM" name="RAM">
  <option class="label" value>RAM Memory</option>
  <option rel="AS1 AS2 GB1" value="KI1">Kingston Value RAM</option>
  <option rel="AS1 AS2 MSI1" value="P5KPL">P5KPL-AM SE</option>
  <option rel="MSI1 GB1" value="960GM">960GM-VGS3 FX </option>
  </select>
</div>

<div>
  <label>Select Video Board: </label> <select disabled="disabled" class="subcat" id="video-card" name="video-card">
  <option class="label" value>Video Card</option>
  <option rel="MSI1 AS2" value="EVGA8400">EVGA GeForce 8400 GS</option>
  <option rel="AS1" value="XFXAMD">XFX AMD Radeon HD 5450</option>
  <option rel="MSI1 GB1" value="GTX750Ti">EVGA GeForce GTX 750Ti SC</option>
  </select>
</div>

复制应用于处理器($supcat)和主板($cat)的代码很难看。因此,为了使将来添加新级别时更容易维护,将代码移动到公共函数中并传递所需的对象可能会很有趣。就像这样:

代码语言:javascript
复制
function updateSelects(obj1, obj2) {
    var _rel = $(obj1).val();
    obj2.find("option").attr("style","");
    obj2.val("");
    if(!_rel) return obj2.prop("disabled",true);
    obj2.find("[rel~='"+_rel+"']").show();
    obj2.prop("disabled",false);
}

这将在onchange事件上调用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30346640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档