【问题标题】:Sort multiple lists based on selected options using JQuery使用 JQuery 根据所选选项对多个列表进行排序
【发布时间】:2020-07-17 21:38:49
【问题描述】:

HTML 代码

<Select id="alphalist">
   <option value="a">A</option>
   <option value="b">B</option>
   <option value="c">C</option>
</Select>
 
<div id="a" class="lists" style="display"> 
  <ul id="alist"> 
      <li>Axe</li> 
      <li>Arc</li> 
      <li>Apple</li>
  </ul>  
</div>

<div id="b" class="lists" style="display:none"> 
  <ul id="blist"> 
      <li>Bat</li> 
      <li>Boat</li> 
      <li>Bee</li>
  </ul>
</div>

<div id="c" class="lists" style="display:none"> 
  <ul id="clist"> 
      <li>Cat</li> 
      <li>Coat</li> 
      <li>Clock</li>  
  </ul> 
</div>

脚本代码

$(function() 
{
 $('#alphalist').change(function(){
 $('.lists').hide();
 $('#' + $(this).val()).show();
 });
});

在这里,我创建了 3 个列表和一个带有选项 A、B 和 C 的下拉菜单。 默认情况下,选项 A 被选中,并且仅显示第一个列表。单击选项 B 的方式相同,仅显示第二个列表,选择选项 C 时仅显示第三个列表。 现在我需要按字母顺序对每个列表进行排序,并显示与所选选项对应的排序列表。

排序的脚本代码是:

var mylist = $('#alist');
var listitems = mylist.children('li').get();
listitems.sort(function(a, b) {
return $(a).text().toUpperCase().localeCompare($(b).text().toUpperCase());
})
$.each(listitems, function(idx, itm) { mylist.append(itm); });  

上面的代码只对第一个列表进行排序。为了对第二个列表进行排序,我们需要通过将 $('#alist) 替换为 $('#blist) 来再次编写上述代码。因此,如果我们有 20 多个列表,我们如何修改上面的代码,以便我们可以对所有可用列表进行排序。如果类名在所有列表之间是通用的,那么如何进行排序?请帮帮我。

【问题讨论】:

  • 为什么不在页面创建时对其进行排序,而不是在显示时对其进行排序。
  • 我最近在一个歌词和和弦网站上工作,其中歌曲名称必须添加到列表中。所以把一个新歌名放进一个大名单是很困难的。
  • 这是服务器端脚本语言和数据库真正有用的地方。您可以按照您喜欢的任何顺序将歌曲存储在数据库中,并让查询以正确的顺序放置它们,或者在从数据库中提取它们后对其进行排序。如果您自己编写 HTML,我提供的答案会有所帮助。

标签: html jquery sorting html-lists unordered


【解决方案1】:

只需遍历所有列表并对每个实例进行排序。这可以在页面加载时完成一次。

这里我使用html(function) 进行循环并返回每个实例的排序子节点

// sort lists on page load
$('.lists ul').html(function(){
  return $(this).children().sort((a,b) => $(a).text().localeCompare($(b).text()));
});

// add the change listener for select
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="a" class="lists"> 
  <ul id="alist"> 
      <li>Axe</li> 
      <li>Arc</li> 
      <li>Apple</li>
  </ul>  
</div>

<div id="b" class="lists" > 
  <ul id="blist"> 
      <li>Bat</li> 
      <li>Boat</li> 
      <li>Bee</li>
  </ul>
</div>

<div id="c" class="lists" > 
  <ul id="clist"> 
      <li>Cat</li> 
      <li>Coat</li> 
      <li>Clock</li>  
  </ul> 
</div>

【讨论】:

    【解决方案2】:

    对数组进行排序通常更容易。您可以使用函数对对象进行排序,但此示例可能更容易捕获文本、对其进行排序并重建列表。

    $(function() {
      function sortList(obj) {
        var arr = [];
        var list = $("ul", obj);
        $("li", list).each(function(i, el) {
          arr.push($(el).text().trim());
        });
        arr.sort();
        $(list).html("");
        $.each(arr, function(k, v) {
          $("<li>").html(v).appendTo(list);
        });
      }
    
      function showList(obj) {
        $(".lists").hide();
        obj.show();
      }
    
      $("#alphalist").change(function() {
        var t = $("#" + $(this).val());
        sortList(t);
        showList(t);
      })
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <Select id="alphalist">
      <option value="a">A</option>
      <option value="b">B</option>
      <option value="c">C</option>
    </Select>
    
    <div id="a" class="lists">
      <ul id="alist">
        <li>Axe</li>
        <li>Arc</li>
        <li>Apple</li>
      </ul>
    </div>
    
    <div id="b" class="lists" style="display:none">
      <ul id="blist">
        <li>Bat</li>
        <li>Boat</li>
        <li>Bee</li>
      </ul>
    </div>
    
    <div id="c" class="lists" style="display:none">
      <ul id="clist">
        <li>Cat</li>
        <li>Coat</li>
        <li>Clock</li>
      </ul>
    </div>

    【讨论】:

    • 我一定会试试的。
    • 为什么要创建新元素而不仅仅是对现有元素进行排序?
    • @charlietfl 是这样的:stackoverflow.com/questions/1134976/…
    • 可以在 jQuery 集合上使用 sort(),就像我在解决方案中那样。这个例子有点老了。对于 nodeList 集合可以使用Array.from(collection).sort(sortfunc)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2021-10-09
    • 2021-03-08
    • 2013-04-02
    • 1970-01-01
    相关资源
    最近更新 更多