【问题标题】:Four select option boxes dynamically change upon each select box option四个选择选项框根据每个选择框选项动态变化
【发布时间】:2016-10-31 22:02:00
【问题描述】:

我正在尝试使用户在第一个选择框上选择一个选项时,第二个选择框的内容将发生变化,依此类推。包括如果用户为第一个和第二个选择选项选择了什么,它也会改变第三个选择框中的内容等等。但是,到目前为止,我遇到了一些问题。目前,如果按照每个选择框的流程正确完成,它可以工作,但我注意到仍有一些方法可以绕过它。 Is there a way to hide all select boxes except for the first one, and when the first option is selected, the second select box appears and so forth?

我是否让这种方式变得复杂?有没有更简单的方法来实现同样的目标?我期待您的回复。

HTML:

<!-- START OF ADDING LOCATIONS -->
<select id="select1" class="ad_inquiry_locations" value="" name="guest_pl" required>

    <option value="" selected disabled>Select primary location</option>
    <option value="Beloit">Beloit</option>
    <option value="Concordia">Concordia</option>
    <option value="Glen-Elder">Glen Elder</option>
    <option value="Jewell">Jewell</option>

</select>

<!-- Start of SECOND GROUP -->
<select id="select2" class="ad_inquiry_locations" value="" name="guest_al-2">

    <option value="" selected disabled>Add a location</option>
    <option value="Beloit">Beloit</option>
    <option value="Concordia">Concordia</option>
    <option value="Glen-Elder">Glen Elder</option>
    <option value="Jewell">Jewell</option>

</select>
<!-- End of SECOND GROUP -->

<!-- Start of THIRD GROUP -->
<select id="select3" class="ad_inquiry_locations" value="" name="guest_al-3">

    <option value="" selected disabled>Add a location</option>
    <option value="Beloit">Beloit</option>
    <option value="Concordia">Concordia</option>
    <option value="Glen-Elder">Glen Elder</option>
    <option value="Jewell">Jewell</option>

</select>
<!-- End of THIRD GROUP -->

<!-- Start of FOURTH GROUP -->
<select id="select4" class="ad_inquiry_locations" value="" name="guest_al-4">

    <option value="" selected disabled>Add a location</option>
    <option value="Beloit">Beloit</option>
    <option value="Concordia">Concordia</option>
    <option value="Glen-Elder">Glen Elder</option>
    <option value="Jewell">Jewell</option>

</select>
<!-- End of FOURTH GROUP -->
<!-- END OF ADDING LOCATIONS -->

JS:

var Lists = [
    document.getElementById("select1"),
    document.getElementById("select2"),
    document.getElementById("select3"),
    document.getElementById("select4")
  ],
  nbLists = Lists.length;


// Binds change events to each list
for (var iList = 0; iList < nbLists; iList++) {
  Lists[iList].onchange = RemoveItems(iList);
}


function RemoveItems(iList) {
  return function() {
    var value = [];

    // Add the selected items of all previous lists including the one changed
    for (var jList = 0; jList <= iList; jList++) value.push(Lists[jList].options[Lists[jList].selectedIndex].text);


    // Hide in all succeeding lists these items
    for (var kList = iList + 1; kList < nbLists; kList++)
      HideItems(kList, value);
  }
}


// Hide items selected in previous lists in all next lists
function HideItems(iList, value) {
  var nbOptions = Lists[iList].options.length,
    nbValues = value.length,
    found;

  if (nbValues === 0) return;

  for (var iOption = 0; iOption < nbOptions; iOption++) {
    // Find if this element is present in the previous lists
    found = false;
    for (var iValue = 0; iValue < nbValues; iValue++) {
      if (Lists[iList].options[iOption].text === value[iValue]) {
        found = true;
        break;
      }
    }

    // If found, we hide it
    if (found) {
      Lists[iList].options[iOption].style.display = "none";
      Lists[iList].options[iOption].selected = "";
    }
    // else we un-hide it (in case it was previously hidden)
    else
      Lists[iList].options[iOption].style.display = "";
  }
}

【问题讨论】:

    标签: javascript jquery html css jquery-selectbox


    【解决方案1】:

    您可以使用 CSS。只需在开头添加一个特定的类即可隐藏所有选择(第一个除外)。

    <select id="select2" class="ad_inquiry_locations hide" value="" name="guest_al-2"> ...
    

    同时定义 CSS 类。

    .hide {
      display: none;
    }
    

    现在您可以在选择一个选项后删除该类,即像这样。

    function RemoveItems(iList) {
      return function() {
        Lists[iList + 1].classList.remove('hide');
        ...
    

    这只是一个原型,会导致错误,因为索引 3 + 1 不存在。因此,请根据您的意愿进行调整。您也可以通过添加类 .hide 再次隐藏您的选择。

    Lists[iList + 1].classList.add('hide');
    ...
    

    Demo

    【讨论】:

    • 跟进问题。如果用户单击“删除”按钮或 ID/类,我将如何重新设置“隐藏”类?
    • 您也可以在 onchange 中检查这一点,然后简单地重置所有选择或通过一些条件来确定使用了哪个选择以及之前设置了什么。
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多