【问题标题】:jQuery list won't sort after appendjQuery列表在追加后不会排序
【发布时间】:2014-07-16 19:39:42
【问题描述】:
$(document).ready(function() {

    $('#new-to-do-item').keyup(function(e) {
        if (e.which === 13) {
           var text = $(this).val();
           var listItem = "<li><input type='checkbox'>" + text + "</li>"
           $(listItem).appendTo('.list');
        }
     });

    //sort
    $(document).on('click', '#coolthings',function(){
        $(".list li").sort(asc_sort).appendTo('.list');
        //$("#debug").text("Output:");
        // accending sort
       function asc_sort(a, b){
           return ($(b).text()) < ($(a).text()) ? 1 : -1;    
       }
}); 

我有一个最初由 4 个项目组成的列表,#coolthings 是一个元素,当我单击时,它将按字母顺序对这些项目进行排序,但是,keyup 函数将新项目附加到列表中,而 #coolthings 按钮不会将整个列表与新添加的项目一起排序,它将按字母顺序对初始列表进行排序,然后按字母顺序添加新项目,使整个列表由两个字母列表组成。 我想知道如何制作它,以便在我添加具有 keyup 功能的新项目后,排序按钮将按字母顺序对整个列表进行排序。

【问题讨论】:

  • 你没有关闭#coolthings点击事件,这是错字吗?
  • 看起来您需要先对列表进行排序,然后在正确的索引处插入新项目,而不是添加/附加新项目。这是最有效的动态排序(例如二叉树如何存储数据以进行快速搜索)。
  • @KingKing 但这会破坏使用“排序”按钮的目的,因为您已经建议按字母顺序附加新的 li 项目

标签: javascript jquery html list sorting


【解决方案1】:

Char Order Maintained 使用 tinysort 插件:

http://jsfiddle.net/EJ9y7/3/

参考here

排序功能也可能需要sorting hints的更好方法

$(document).ready(function () {
    $('#new-to-do-item').keyup(function (e) {
        if (e.which === 13) {
            var text = $(this).val();
            var listItem = "<li><input type='checkbox'>" + text + "</li>";
            $(listItem).appendTo('.list');
        }
    });
});

//sort
$(document).on('click', '#coolthings', function () {
    var sorted = $(".list li").sort(asc_sort);
    $(".list").append(sorted);
    function asc_sort(a, b) {
        return ($(b).text().toUpperCase()) < ($(a).text().toUpperCase()) ? 1 : -1;

    }
});

【讨论】:

  • 非常感谢,工作完美,据我了解,empty函数清空整个列表,然后append函数将整个排序的列表再次添加到列表中,然后新列表为显示?
  • @frankcrest 魔法不是.empty() 所做的,魔法是.toUpperCase(),如果你想不区分大小写,你应该把所有的文本转换成小写或大写,否则排序会出乎意料。您的原始示例中的所有 4 个项目都以大写字母开头,而在测试时,我们只是输入了一些小写字母,因此出现了意外的结果。
  • @KingKing 哦,哇,我明白为什么会这样了,所以 empty() 是必要的吗?是我认为的那样吗?
  • @frankcrest no,empty() 不是必需的。
  • jsfiddle.net/EJ9y7/3 最全面的方法是使用 Tsort 插件来确保字符顺序。如上所述,不需要为空。
【解决方案2】:

您不能对 HTML 元素进行排序,但需要先分离它们(并在排序后重新附加它们)。

这将起作用(请参阅here):

$(function(){
     $('#new-to-do-item').keyup(function(e) {
         console.log(e.which == 13);
         if (e.which == 13) {
           var text = $(this).val();
           var listItem = "<li><input type='checkbox'>" + text + "</li>";
           $(listItem).appendTo('.list');
           $(this).val('');
        }
     });

    $(document).on('click', '#coolthings',function(){
        $(".list li").detach().sort(asc_sort).appendTo('.list');
       function asc_sort(a, b){
           return ($(b).text()) < ($(a).text()) ? 1 : -1;    
       }
    });
});

【讨论】:

  • 嘿伙计,谢谢您的回复,但是,它不适用于我的 html,是我的 html 错误还是什么,这是我的 html jsfiddle.net/48T4U/3
  • @frankcrest 什么不起作用?唯一可以实现的部分是case-insensitivity,但添加新项目并对它们进行排序对我来说就像一个魅力
  • 其实不用detach()也可以jsfiddle.net/viphalongpro/48T4U/5
【解决方案3】:

问题是您只对 javascript 列表进行排序。您不对 html 列表进行排序。这是因为$(".list li") 返回&lt;li&gt; 节点的javascript 表示。如果要显示它,则必须重新排列 html 树。我认为最简单的方法是删除列表节点的内容并重新插入&lt;li&gt; 节点。

【讨论】:

    【解决方案4】:

    尽管 muffle 的解决方案有效,但 detach() 并不是你的解决方案无效的原因。

    我假设你的 html 看起来像这样

    <ul class="list">
        <li> <input type='checkbox'>hi</li>
        <li> <input type='checkbox'>bi</li>
        <li> <input type='checkbox'>zi</li>
        <li> <input type='checkbox'>ai</li>
    </ul>
    

    什么时候应该是这样的

    <ul class="list">
        <li><input type='checkbox'>hi</li>
        <li><input type='checkbox'>bi</li>
        <li><input type='checkbox'>zi</li>
        <li><input type='checkbox'>ai</li>
    </ul>
    

    该空格会导致您的初始硬编码元素始终按字母顺序排列在“a”之前。修复您的初始 html 或去除空格将是解决方案。

    查看您的 HTML 后,您的问题是大写优先于小写。您可能正在测试小写的附加输入

    【讨论】:

    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2021-12-19
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多