簡體   English   中英

如何基於嵌套的ul列表創建嵌套的選擇菜單?

[英]How do I create a nested select menu based off a nested ul list?

我想基於嵌套的HTML ul列表創建“嵌套”選擇菜單。 例如,向用戶顯示類別的選擇菜單,然后選擇該根類別的選項將打開另一個帶有子類別的選擇菜單。 (如果子類別包含子類別,則循環繼續。我希望能夠根據ul列表打開任意數量的子類別子菜單。)

例如,在頁面上給出以下代碼:

<ul id="select-menu-layout" style="display: none">
  <li>A option
    <ul>
      <li>a1 name</li>
      <li>a2 name</li>
      <li>a3 name</li>
    </ul>
  </li>
  <li>B option
    <ul>
      <li>b1 name</li>
      <li>b2 name
        <ul>
          <li>b21 choice</li>
          <li>b22 choice</li>
          <li>b23 choice</li>
        </ul>
      </li>
      <li>b3 name</li>
    </ul>
  </li>
  <li>C name</li>
</ul>

<!-- select menus will be shown in the container below -->
<div class="select-menu-container"></div>

在上面的示例中,最初將顯示一個選擇菜單:

<select>
  <option>A option</option>
  <option>B option</option>
  <option>C option</option>
</select>

然后選擇“ B選項”將顯示第二個選擇菜單(基於上面的HTML列表):

<select>
  <option>b1 name</option>
  <option>b2 name</option>
  <option>b3 name</option>
</select>

選擇“ b2名稱”將顯示第三個選擇菜單:

<select>
  <option>b21 choice</option>
  <option>b22 choice</option>
  <option>b23 choice</option>
</select>

我假設您需要javascript / jQuery來做到這一點? 我在考慮這段代碼(盡管我可能很錯):

<div class="select-menu-container"></div>

<script>
function addSelectMenu(node){
  $(".select-menu-container").append("<select style='display: none'></select>")
  node.each(function(){
    var name = $(this).val()
     $("select:last").append("<option>" + name + "</option>")
  })
}

$("ul").each(function(){
  addSelectMenu($(this))
})
</script>

有任何想法嗎?

為了在具有類似嵌套可折疊列表的行為的一系列選擇元素中轉換ul / li列表,可能的解決方案可以基於遞歸方法。

必須將每個選擇鏈接到上一個選擇,以切換可見性。

片段:

 function createSelectFromUl(ele, parentLink) { var txtParentNode = parentLink || ''; var options = ele.map(function (idx, ele) { var txt = $(ele).contents().filter(function (idx, ele) { if (ele.nodeType == Node.TEXT_NODE) { return true; } }).text().trim(); return $('<option/>', {text: txt}) }); if (ele.children('ul').length == 0) { return [$('<select/>', {parentNode: txtParentNode}).append(options.toArray())]; } var retVal = [$('<select/>', {parentNode: txtParentNode}).append(options.toArray())]; ele.children('ul').each(function (idx, ele) { txtParentNode = $(ele.parentNode).contents().filter(function (idx, ele) { if (ele.nodeType == Node.TEXT_NODE) { return true; } }).text().trim(); var childSelects = createSelectFromUl($(ele).children('li'), txtParentNode); $.merge(retVal, childSelects); }); return retVal; } $(function () { var seleEles = createSelectFromUl($('#select-menu-layout > li')); $('.select-menu-container').append(seleEles); $('.select-menu-container select:gt(0)').hide(); $('.select-menu-container select').on('change', function (e) { var txtParentNode = $(this).val(); $(this).nextAll().hide(); $('.select-menu-container select[parentNode="' + txtParentNode + '"]').toggle(); }).trigger('change'); }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <ul id="select-menu-layout" style="display: none"> <li>A option <ul> <li>a1 name</li> <li>a2 name</li> <li>a3 name</li> </ul> </li> <li>B option <ul> <li>b1 name</li> <li>b2 name <ul> <li>b21 choice</li> <li>b22 choice</li> <li>b23 choice</li> </ul> </li> <li>b3 name</li> </ul> </li> <li>C name</li> </ul> <div class="select-menu-container"></div> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM