【问题标题】:Sorting HTML list by child attribute with Tinysort使用 Tinysort 按子属性对 HTML 列表进行排序
【发布时间】:2016-01-27 16:13:28
【问题描述】:

我想通过使用LI 元素的第一个TIME 元素来使用Tinysort 对该列表进行排序。

<div class="box">
    <ul>
        <li><a href="#">John</a>
            <div class="bubble">
                <p><strong>John</strong></p>
                <p>
                    <time datetime="01/01/1950">01/01/1950</time> -
                    <time datetime="10/02/2005">10/02/2005</time>
                </p>
            </div>
        </li>
        <li><a href="#">Alice</a>
            <div class="bubble">
                <p>Alice</p>
            </div>
        </li>
        <li><a href="#">Mary</a>
            <div class="bubble">
                <p>Mary</p>
                <p>
                    <time datetime="01/02/1920">01/02/1920</time> -
                    <time datetime="01/02/2015">01/02/2015</time>
                </p>
            </div>
        </li>
    </ul>
</div>

所以在我的情况下,它应该说:玛丽 - 约翰 - 爱丽丝(或者不太正确,但可以接受,可能是:爱丽丝 - 玛丽 - 约翰)。

我试过了

tinysort('.box ul>li', {selector:'time',attr:'datetime'});

但它弄乱了我的列表,只对 bubble div 进行排序,而不是对 li 进行排序。此外,任何没有time 的元素都会被忽略,因为它没有指向li

或者,我可以在li 元素内添加一个时间属性,但是我弄脏的 HTML 越少越好,因为这样的属性并没有真正添加任何语义。有什么建议可以用尽可能少的 HTML 修改对列表进行排序?我想要的可能是让 tinysort 知道我想对 lis 而不是 bubbles 进行排序。

【问题讨论】:

    标签: javascript jquery html sorting tinysort


    【解决方案1】:

    这里的问题是您尝试排序的属性不是数字,因此它像字符串一样处理。在时间元素或列表元素中添加 Unix 时间戳并对其进行排序。您可以在服务器端或客户端执行此操作。

    这是一个小提琴:https://jsfiddle.net/Sjeiti/o9kv8be2/ 这是代码(我很懒,将时间戳添加到列表元素中,但您可能应该将其添加到时间元素中):

    var listElements = document.querySelectorAll('li');
    for (var i = 0, l = listElements.length; i < l; i++) {
      var li = listElements[i],
        time = li.querySelector('time'),
        date = time && new Date(time.getAttribute('datetime'));
      date && li.setAttribute('data-timestamp', date.getTime());
    }
    document.querySelector('button').addEventListener('click', function() {
      tinysort(listElements, {
        data: 'timestamp'
      });
    });
    

    【讨论】:

    • 小提琴似乎不起作用(?) - 我添加了数据时间戳。无论如何,一个类似的解决方案对我来说很清楚,它需要修改 HTML...没有其他方法吗?
    • Fiddles 外部资源已消失,现已修复。总是有其他方法,但在我看来,这是我能想到的最简单/最干净的解决方案。
    • 这很好用,除了在我的示例中,它首先对具有空时间戳的元素进行排序。控制台在 var date 上打印 null (显然)并且那些 LI 没有被修改。另外,对于记录,我有一个错误,我的日期实际上是欧洲风格的 (dd/mm/yyyy),所以我只是在 HTML 中将它们更改为 yyyy-mm-dd。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多