我想按字母顺序对列表进行排序,这是我的代码:
!DOCTYPE html>
<html>
<head>
<title>Sort list items alphabetically with Javascript</title>
<script type="text/javascript">
function sortUnorderedList(ul, sortDescending) {
if(typeof ul == "string")
ul = document.getElementById(ul);
var lis = ul.getElementsByTagName("LI");
var vals = [];
for(var i = 0, l = lis.length; i < l; i++)
vals.push(lis[i].innerHTML);
vals.sort();
if(sortDescending)
vals.reverse();
for(var i = 0, l = lis.length; i < l; i++)
lis[i].innerHTML = vals[i];
}
window.onload = function() {
var desc = false;
document.getElementById("test").onclick = function() {
sortUnorderedList("list", desc);
desc = !desc;
return false;
}
}
</script>
</head>
<body>
<div id="test"> <a href="#">Sort List</a></div>
<ul id="list">
<li>Peter</li>
<li>Mary</li>
<li>Paul</li>
<li>Allen</li>
<li>James</li>
<li>Vicki</li>
<li>Brock</li>
<li>Dana</li>
<li>Frank</li>
<li>Gil</li>
<li>Helen</li>
</ul>
</body>
但是,当我想添加名称的链接时,列表会变得混乱(不再是字母),那么我应该更改什么? 我完全不了解javascript,有人可以帮助我,谢谢
<div id="test"> <a href="#">Sort List</a></div>
<ul id="list">
<li><a href="tumblr.com/post/57781372261">Peter</a></li>
<li><a href="tumblr.com/post/57783141055">Mary</a></li>
<li><a href="tumblr.com/post/57781372261">Paul</a></li>
</ul>
添加链接时,帖子将按照那里的数字排序,而不是按名称排序..
答案 0 :(得分:1)
您按<li>
和</li>
之间的任何内容进行排序,其中包括网址,而不仅仅是名称。因此,如果URL的排序方式与名称不同,则结果将无序。在您的情况下,您将按URL中的ID号进行排序。
解决此问题的一种简单方法是将名称放在锚元素中,例如
<li><a data-name="Peter" href="tumblr.com/post/57781372261">Peter</a></li>
<li><a data-name="Mary" href="tumblr.com/post/57783141055">Mary</a></li>
<li><a data-name="Paul" href="tumblr.com/post/57781372261">Paul</a></li>
将data-name
属性放在href
属性之前应该优先使用。
实际上,我并不完全确定这会奏效。 innerHTML
属性包含浏览器解析后的HTML,并且可以重新排序属性。要真正解决这个问题,您需要为sort()
提供一个比较函数来查找名称并进行比较,而不是直接比较HTML。
这是一个仅比较文本的版本。它适用于DOM节点本身,而不是与HTML进行转换。
function compareText(a1, a2) {
var t1 = a1.innerText, t2 = a2.innerText;
return t1 > t2 ? 1 : (t1 < t2 ? -1 : 0);
}
function sortUnorderedList(ul, sortDescending) {
if(typeof ul == "string") {
ul = document.getElementById(ul);
}
var lis = ul.getElementsByTagName("LI");
var vals = [];
for(var i = 0, l = lis.length; i < l; i++) {
vals.push(lis[i]);
}
vals.sort(compareText);
if(sortDescending) {
vals.reverse();
}
ul.innerHTML = '';
for(var i = 0, l = vals.length; i < l; i++) {
ul.appendChild(vals[i]);
}
}