【问题标题】:sorting an ul list according to a li element with jquery?使用 jquery 根据 li 元素对 ul 列表进行排序?
【发布时间】:2011-03-23 13:50:07
【问题描述】:

我正在使用

    元素创建一个水平列表,但我想做的是根据
  • 元素按字母顺序放置每个
      元素。例如
    <ul class="list">
        <li>Name</li>
        <li>Surname</li>
        <li>Unit</li>
        <li>City</li>
    </ul>
    <ul class="list">
        <li>John</li>
        <li>Boe</li>
        <li>B.A.</li>
        <li>NY</li>
    </ul>
    <ul class="list">
        <li>Jane</li>
        <li>Doe</li>
        <li>M.A.</li>
        <li>CA</li>
    </ul>
    

    并根据姓氏字段将它们排序。有没有办法用 jquery 做到这一点?

    提前致谢

    //编辑//

    我使用的代码是这样的

    $.ajax({
        type: 'GET',
        url: 'list.php',
        data: 'id='+id,
        dataType: 'xml',
        success: function(data) {
            var xml;
            if (typeof data == "string") {
                xml = new ActiveXObject("Microsoft.XMLDOM");
                xml.async = false;
                xml.loadXML(data);
            } else {
                xml = data;
            }
    
            $(xml).find('item').each(function(){
                var id = $(this).find("id").text();
                var name = $(this).find("name").text();
                var surname = $(this).find("surname").text();
                var units = $(this).find("units").text();
                var city = $(this).find("city").text();
                $("#listContainer").append('<ul class="list" id="'+id+'"><li style="width:30px;">'+name+'</li><li style="width:100px;">'+surname+'</li><li style="width:100px;">'+units+'</li><li style="width:100px;">'+city+'</li></ul>');
            }); //close each(   
        }
    }); 
    

【问题讨论】:

  • 您能粘贴您尝试过的代码吗?
  • 您知道这看起来更像表格数据吗?
  • 是的,它看起来像表格数据,但我一开始不想使用表格,我根据它构建了整个页面,现在我的客户希望我做一个高级排序选项,我已经认为如果我能以某种方式对每个
      元素进行排序,那将是最糟糕的解决方案

标签: jquery html list sorting


【解决方案1】:

WORKING DEMO

$('.grid ul:gt(0)').each(function() {
    var txt1 = $(this).children('li:eq(1)').text();
    $(this).data('name', txt1);
});

var items = $('.grid ul');
items.sort(function(a, b) {
    var chA = $(a).data('name');
    var chB = $(b).data('name');
    if (chA < chB) return -1;
    if (chA > chB) return 1;
    return 0;
});
var grid = $('.grid');
$(grid).append(items);

和 HTML

<div class="grid">
    <ul class="list">
        <li>Name</li>
        <li>Surname</li>
        <li>Unit</li>
        <li>City</li>
    </ul>
    <ul class="list">
        <li>John</li>
        <li>Boe</li>
        <li>B.A.</li>
        <li>NY</li>
    </ul>
    <ul class="list">
        <li>Jane</li>
        <li>Doe</li>
        <li>M.A.</li>
        <li>CA</li>
    </ul>
    <ul class="list">
        <li>Lin</li>
        <li>Zyan</li>
        <li>M.A.</li>
        <li>OR</li>
    </ul>
    <ul class="list">
        <li>Matt</li>
        <li>Albright</li>
        <li>M.A.</li>
        <li>CA</li>
    </ul>
</div>

将导致:

它是如何工作的:
我们在所需的li:eq()内寻找文本
我们将此文本设置为每个 UL 元素的 jQuery .data()。
比我们只需按检索到的 .data() 文本对 ul 进行排序 - 按字母顺序!

编码愉快!

【讨论】:

  • 请检查这个 jsfiddle。 jsfiddle.net/Kaushik007/qtbc9mt0 当点击复选框时,我想要 ul > li > 第一个 div 文本应该是升序。国家 div 文本不应该升序它应该保持原样。此代码有效,但不符合我的要求。提前致谢。
  • @K-Series 你的要求很奇怪。您正在对包含多个内容的元素进行排序,但您希望它能够神奇地将其他元素保留在 初始位置。首先不要将它们放在同一个容器列表中。希望这是有道理的。排序的目的正是为了 - 对单个列表进行排序,而不是对子内容做花哨的事情......你可以写一个问题来描述你实际追求的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多