使用 Tinysort 按子属性对 HTML 列表进行排序
Sorting HTML list by child attribute with Tinysort
我想使用 Tinysort 使用 LI
元素的第一个TIME
元素对此列表进行排序。
<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
元素中添加一个 time 属性,但我越不弄脏 HTML 越好,因为这样的属性并没有真正添加任何语义。对列表进行排序的任何建议都尽可能少地修改 HTML ?我想要的可能是让 tinysort 意识到我想对 li
s 而不是 bubble
s 进行排序。
这里的问题是您尝试排序的属性不是数字,因此它像字符串一样处理。将 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'
});
});
相关文章:
- 为什么HTML5拖放的目标是孩子?(可排序列表)
- 当属性不一致时,如何根据属性对JS对象列表进行排序
- jQuery UI可排序-多连接列表拖动
- 如何在javascript中通过rtl字母表对列表进行排序和分组
- 如何在Javascript中创建排序、拖放多级列表
- 使用选项组对下拉列表进行排序
- JQuery根据连字符前的首字母对列表进行排序
- 可排序和可丢弃的淘汰列表
- 在Javascript中,当使用array.prush方法向列表中添加项目时,如何对其进行排序
- 使用JS或新查询对列表进行排序
- 对Soundcloud自定义播放器播放列表的顺序进行排序
- 如何在角度js的自动完成下拉列表中对项目列表(按字母顺序)进行排序
- 尝试将长列表排序为单独的列
- 不使用排序数组的动态列表排序
- 使用角度 js 按顺序列表排序
- 在JavaScript和MySQL中存储列表排序顺序的替代方法
- 如何用Vue.js动画化列表排序
- 按字母顺序对列表排序,末尾为字符
- IE7,jQuery-1.6.2:列表项向下移动到包含元素的下面(多列表排序)
- 按元素的值对列表排序