简体   繁体   English

如何按文本内容的字母顺序对元素进行排序,并在存在的情况下引入下一个 div?

[英]How can I sort elements alphabetically by text content and bring next div if existing?

I have a menu I want to sort alphabetically.我有一个菜单,我想按字母顺序排序。 I found this: Sort DIVs alphabetically without destroying and recreating them?我发现了这个: Sort DIVs alphabetically without destroying and recreating them?

I applied the jQuery script to "sort".我将 jQuery 脚本应用于“排序”。 Works great.效果很好。 The only logical problem is that the hidden divs (class: hidden) don't follow, they show/hides by click on "btn_expand" and toggle next div.唯一合乎逻辑的问题是隐藏的 div(类:隐藏)不跟随,它们通过单击“btn_expand”并切换下一个 div 来显示/隐藏。

I have tried some different ways to develop the script but I don't find any good solution to it.我尝试了一些不同的方法来开发脚本,但我没有找到任何好的解决方案。 Ends up with a bunch of code and messy results.最终得到一堆代码和混乱的结果。 It should be solved as if next div hasClass "hidden" then "bring it with" and append after the "btn_expand" but I fail with that.它应该像下一个 div hasClass“隐藏”然后“带上它”并在“btn_expand”之后追加一样解决,但我失败了。 Can somebody with more skills maybe help out, it would make my day.有更多技能的人可以帮忙吗,这会让我开心。 :) :)

Thanks!谢谢!

 $('.sort').sort(function(a, b) { if (a.textContent < b.textContent) { return -1; } else { return 1; } }).appendTo('body'); $(".btn_expand").on('click', function() { $(this).next("div").toggle(); });
 .btn_expand { background: red; }.hidden { display: none; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <p>Without sorting</p> <div class="btn_expand">CCC</div> <div class="hidden">Hidden content shown by press CCC</div> <div class="btn_no_expand">EEE</div> <div class="btn_no_expand">AAA</div> <div class="btn_no_expand">DDD</div> <div class="btn_expand">BBB</div> <div class="hidden">Hidden content shown by press BBB</div> <br><br> <p>With sorting</p> <div class="btn_expand sort">CCC</div> <div class="hidden">Hidden content shown by press CCC</div> <div class="btn_no_expand sort">EEE</div> <div class="btn_no_expand sort">AAA</div> <div class="btn_no_expand sort">DDD</div> <div class="btn_expand sort">BBB</div> <div class="hidden">Hidden content shown by press BBB</div>

You could sort, then for each matched element, check if next sibling has class .hidden , if so, add it to the selector, and then append to body:您可以排序,然后对于每个匹配的元素,检查下一个兄弟是否具有类.hidden ,如果是,则将其添加到选择器,然后附加到正文:

 $('.sort').sort(function(a, b) { if (a.textContent < b.textContent) { return -1; } else { return 1; } }).each((index, el) => { const hidden = $(el).next(); if (hidden.hasClass('hidden')) { $(el).add(hidden).appendTo('body'); } else { $(el).appendTo('body'); } }); $(".btn_expand").on('click', function () { $(this).next("div").toggle(); });
 .btn_expand{background:red;}.hidden{display: none;}
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="btn_expand sort">CCC</div> <div class="hidden">Hidden content shown by press CCC</div> <div class="btn_no_expand sort">EEE</div> <div class="btn_no_expand sort">AAA</div> <div class="btn_no_expand sort">DDD</div> <div class="btn_expand sort">BBB</div> <div class="hidden">Hidden content shown by press BBB</div>

Or, in an even shorter form, you can do this:或者,以更短的形式,您可以这样做:

 function sortBlock(sel){ const block=$(sel); $('.sort', block).sort((a, b)=>a.textContent.localeCompare(b.textContent)).each((i,el)=>$(el).add($(el).next(".hidden")).appendTo(block)); } sortBlock("#two"); $(".btn_expand").on('click',function() {$(this).next("div").toggle();});
 .btn_expand{background:red;}.hidden{display: none;}
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <h2>block 1</h2> <div id="one"> <div class="btn_expand sort">CCC</div> <div class="hidden">Hidden content shown by press CCC</div> <div class="btn_no_expand sort">EEE</div> <div class="btn_no_expand sort">AAA</div> <div class="btn_no_expand sort">DDD</div> <div class="btn_expand sort">BBB</div> <div class="hidden">Hidden content shown by press BBB</div> </div> <h2>block 2</h2> <div id="two"> <div class="btn_expand sort">CCC</div> <div class="hidden">Hidden content shown by press CCC</div> <div class="btn_no_expand sort">EEE</div> <div class="btn_no_expand sort">AAA</div> <div class="btn_no_expand sort">DDD</div> <div class="btn_expand sort">BBB</div> <div class="hidden">Hidden content shown by press BBB</div> </div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM