【问题标题】:How to sort checkboxes by class, value, and checked如何按类、值和选中对复选框进行排序
【发布时间】:2016-07-13 10:20:37
【问题描述】:

我有一个 div,#subfilterNamesContainer,其中包含一个复选框列表。我正在尝试编写一个函数,将复选框分为 3 个部分。

  • 带有class="default" 的复选框应按值排序在顶部,无论是否选中。
  • 然后我需要列出检查的不是class="default" 的复选框,按值排序。
  • 最后我需要显示所有未选中并再次按值排序的 NOT class="default"

在这三个部分之间也有一条水平线是理想的。

我怎样才能完成这项任务?目标是在顶部显示用户默认复选框,然后是选中的非默认复选框,然后是未选中的非默认复选框。这不需要响应用户检查,只有在调用这个新函数(我们称之为sortGiveNamesFilter)时。

<div id="subfilterNamesContainer">
    <input type="checkbox" value="X"> X <br>
    <input type="checkbox" value="A"> A <br>
    <input type="checkbox" value="A B" class="default"> A B <br>
    <input type="checkbox" value="A A" class="default"> A A <br>
    <input type="checkbox" value="F"> F <br> <--THiS ONE WILL BE CHECKED
    <input type="checkbox" value="E"> E <br> <--THiS ONE WILL BE CHECKED
</div>

调用我的新函数时的最终结果应该是:

<div id="subfilterNamesContainer">
    <input type="checkbox" value="A A" class="default"> A A <br>
    <input type="checkbox" value="A B" class="default"> A B <br>
    <hr>
    <input type="checkbox" value="E"> E <br> <--THiS ONE WILL BE CHECKED
    <input type="checkbox" value="F"> F <br> <--THiS ONE WILL BE CHECKED
    <hr>
    <input type="checkbox" value="A"> A <br>
    <input type="checkbox" value="X"> X <br>
</div>

【问题讨论】:

  • 请注意,StackOverflow 是为了帮助您调试为解决问题而编写的代码。它不是代码编写服务。请编辑您的问题以包含您尝试编写的任何 JS 代码来解决此特定问题。
  • 谢谢,我什至不知道从哪里开始或如何处理这种情况。我不知道我可以调用任何 jQuery 函数来提取我的项目以按类排序然后按值排序。
  • 要对元素进行实际排序,您可以使用sort() 方法。

标签: javascript jquery html sorting checkbox


【解决方案1】:

首先,您需要稍微修改您的 HTML,以便在重新排列复选框时,它们旁边的文本节点也会移动。为此,您可以使用 label 元素包围两个节点,如下所示:

<div id="subfilterNamesContainer">
    <label>
        <input type="checkbox" value="X"> X
    </label>
    <label>
        <input type="checkbox" value="A"> A
    </label>
    <label>
        <input type="checkbox" value="A A" class="default"> A A
    </label>
    <label>
        <input type="checkbox" value="A B" class="default"> A B
    </label>
    <label>
        <input type="checkbox" value="F" checked="true"> F
    </label>
    <label>
        <input type="checkbox" value="E" checked="true"> E
    </label>
</div>

要实现label元素的排序可以使用sort()方法,提供你自己定义排序逻辑的函数,首先放置.default复选框,然后是选中的复选框,然后是未选中的复选框,每个子部分由复选框的value 排序。排序完成后,您可以搜索最后一个 .default:checked 元素并在它们后面添加 hr。像这样的:

function sortGiveNamesFilter() {
    $('#subfilterNamesContainer label').sort(function(a, b) {
        var $a = $(a).find(':checkbox'),
            $b = $(b).find(':checkbox');

        if ($a.hasClass('default') && !$b.hasClass('default'))
            return -1;
        else if (!$a.hasClass('default') && $b.hasClass('default'))
            return 1;

        if ($a.is(':checked') && !$b.is(':checked'))
            return -1;
        else if (!$a.is(':checked') && $b.is(':checked'))
            return 1;

        if ($a.val() < $b.val())
            return -1;
        else if ($a.val() > $b.val())
            return 1;

        return 0;
    }).appendTo('#subfilterNamesContainer');

    $('#subfilterNamesContainer .default:last, #subfilterNamesContainer :checked:last').closest('label').after('<hr />');
}

Working example

请注意,使用三元表达式可以使 JS 代码更短,我只是保持它的详细程度以使其工作原理一目了然。

【讨论】:

  • 哦,哇,这太有帮助了。谢谢!现在,我真的明白它在做什么了。查看在线示例并没有多大帮助,但这很棒。
猜你喜欢
  • 2015-03-06
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2021-03-28
  • 2014-03-24
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多