问题是我有一个联系人列表,当有人改变他/她的状态时,我会尝试将它们移到列表的顶部。到目前为止,一切都工作,使用IE9,Firefox 4无效。我给你看了代码:
function sortByStatus()
{
var divs = getElementsByClassName(document,"status_sort");
divs.sort(compare);
for (var i = 0; i < divs.length; i++)
{
$("#contact_info").append(divs[i]);
}
}
function compare(div1, div2)
{
var id1 = div1.getAttribute("id");
var id2 = div2.getAttribute("id");
if (id1 > id2)
return 1;
else if (id1 < id2)
return -1;
else
return 0;
}
任何想法或可能的解决方案?谢谢。
更新
我已尝试过MrBuuBuu解决方案并且它的工作方式很有用,因为现在按状态排序有效但字母排序无法正常工作。我不得不改变MrBuuBuu解决方案的部分比较功能,因为我将联系人的姓名与代表状态的名称之前的数字进行比较(例如2John,2表示离线,1表示在线)所以我必须比较与'&lt;'和'&gt;'并返回1,-1或0。
但最糟糕的是,现在它不适用于IE7或IE8 ......按状态排序无效。
真的很奇怪,任何想法?
答案 0 :(得分:2)
document.getElementsByClassName返回NodeList,而不是数组。所以你必须先将它转换为数组。我还清理了你的compare()函数。
function compare(div1, div2)
{
var id1 = div1.id;
var id2 = div2.id;
if (id1 < id2) {
return - 1;
}
if (id1 == id2) {
return 0;
}
return 1;
}
function sortByStatus()
{
var divs = document.getElementsByClassName("status_sort");
var divArray = $.map(divs, function(div) { return div; });
divArray.sort(compare);
$.each(divArray, function(i, div){
$("#contact_info").append(div);
});
}
答案 1 :(得分:1)
如果您正在使用浏览器的本机getElementsByClassName
函数,那么最终可能会得到一个不是可排序数组的DOM节点集合。
当你说它不能正常工作时,你是否收到任何错误,或者只是数组没有被排序?我假设您收到错误,因为sort
未定义。
您可以尝试的一件事是在排序之前将节点集合克隆到纯JavaScript数组:
divs = [].slice.call(divs);
divs.sort(...
我没有IE9来测试这个,但使用Chrome:
// undefined
document.getElementsByClassName("someclass").sort
可是:
// the sort function
[].slice.call(document.getElementsByClassName("someclass")).sort
答案 2 :(得分:0)
你确定它一直在运作吗?全局范围内没有getElementsByClassName
这样的功能。
请尝试使用document.getElementsByClassName("status_sort")
。