在网页开发场景中,我们经常需要对页面中的列表项、表格数据等内容进行排序展示,比如商品列表按价格排序、评论按时间排序等。HTML本身提供了基础的有序列表标签,结合JavaScript可以灵活实现各类排序需求,下面介绍具体的实现方法。

一、使用HTML原生有序列表实现固定排序
如果只是需要展示固定顺序的内容,不需要动态调整顺序,可以直接使用<ol>标签,它会自动为列表项添加递增的序号,默认就是按代码中的顺序排序。
<ol> <li>第一项内容</li> <li>第二项内容</li> <li>第三项内容</li> </ol>
如果需要调整顺序,只需要调整<li>标签的排列顺序即可,<ol>会自动更新序号。还可以通过reversed属性实现倒序展示:
<!-- 倒序展示列表项 --> <ol reversed> <li>第一项内容</li> <li>第二项内容</li> <li>第三项内容</li> </ol>
二、使用JavaScript实现无序列表动态排序
当列表是无序列表<ul>,或者需要动态调整排序规则时,就需要配合JavaScript来实现。核心思路是获取所有列表项,按照规则排序后重新插入到列表中。
1. 按文本内容升序排序
以下示例实现点击按钮后,将无序列表的项按文本内容的字母顺序升序排列:
// 获取列表元素
const list = document.getElementById('sortList');
// 获取所有列表项
const items = Array.from(list.getElementsByTagName('li'));
// 按文本内容升序排序
items.sort((a, b) => {
return a.textContent.localeCompare(b.textContent);
});
// 清空列表后重新插入排序后的项
list.innerHTML = '';
items.forEach(item => {
list.appendChild(item);
});
对应的HTML结构如下:
<ul id="sortList"> <li>香蕉</li> <li>苹果</li> <li>橙子</li> <li>葡萄</li> </ul> <button onclick="sortList()">按名称升序排序</button>
2. 按自定义属性排序
如果列表项带有自定义属性,比如data-price表示价格,就可以按照该属性的值排序:
function sortByPrice() {
const list = document.getElementById('priceList');
const items = Array.from(list.getElementsByTagName('li'));
// 按data-price属性值升序排序
items.sort((a, b) => {
return parseFloat(a.dataset.price) - parseFloat(b.dataset.price);
});
list.innerHTML = '';
items.forEach(item => list.appendChild(item));
}
对应的HTML结构:
<ul id="priceList"> <li data-price="15">苹果 15元</li> <li data-price="8">香蕉 8元</li> <li data-price="20">橙子 20元</li> </ul> <button onclick="sortByPrice()">按价格升序排序</button>
三、表格内容排序实现
对于表格内容的排序,思路和列表排序类似,都是获取行元素,排序后重新插入。以下示例实现点击表头按对应列内容排序:
function sortTable(colIndex) {
const table = document.getElementById('dataTable');
const tbody = table.getElementsByTagName('tbody')[0];
const rows = Array.from(tbody.getElementsByTagName('tr'));
// 按指定列的内容排序
rows.sort((a, b) => {
const cellA = a.getElementsByTagName('td')[colIndex].textContent;
const cellB = b.getElementsByTagName('td')[colIndex].textContent;
// 尝试转为数字排序,失败则按文本排序
const numA = parseFloat(cellA);
const numB = parseFloat(cellB);
if (!isNaN(numA) && !isNaN(numB)) {
return numA - numB;
}
return cellA.localeCompare(cellB);
});
// 重新插入排序后的行
tbody.innerHTML = '';
rows.forEach(row => tbody.appendChild(row));
}
对应的表格结构:
<table id="dataTable" border="1">
<thead>
<tr>
<th onclick="sortTable(0)">商品名</th>
<th onclick="sortTable(1)">价格</th>
<th onclick="sortTable(2)">库存</th>
</tr>
</thead>
<tbody>
<tr>
<td>鼠标</td>
<td>50</td>
<td>120</td>
</tr>
<tr>
<td>键盘</td>
<td>120</td>
<td>80</td>
</tr>
<tr>
<td>耳机</td>
<td>80</td>
<td>200</td>
</tr>
</tbody>
</table>
四、注意事项
- 排序前需要将类数组的列表项或行转为真正的数组,才能使用
sort方法 - 如果内容是中文,使用
localeCompare方法可以正确按照中文拼音排序 - 数字排序前需要转为数值类型,避免按字符串规则排序导致错误,比如"10"排在"2"前面
- 如果排序的数据量很大,频繁操作DOM可能影响性能,可以考虑使用文档碎片
DocumentFragment优化
HTMLlist_sortcontent_orderJavaScript修改时间:2026-06-23 12:21:22