2

我在 JavaScript 中排序有一个非常奇怪的问题。我徘徊在这个奇妙而可怕的分类世界中,想知道你们是否可以帮助我:

基本上,我试图模仿 tabindex HTML 属性,它基本上改变了页面中“tabbing”的顺序:具有 tabindex 的元素是第一个,最小的正数在前,向下,没有 tabindex 的元素是最后一个以不变的顺序。所以,它是这样的:

tabindex=1,tabindex=2,tabindex=5,tabindex=5000,没有tabindex,没有tabindex,没有tabindex,等等……

我正试图让这个工作。在 Chrome 中它不起作用,因为(我认为,至少)它使用的排序算法与所有其他主要浏览器相比。

Chrome 中返回的内容是零星的和奇怪的,其中一个元素完全乱序,而其他元素曾经位于顶部而不是底部。

在所有其他浏览器中,它都可以工作(除了 tabindex'd 元素的顺序相反,但这真的很容易修复,我打算在完成这项工作后做)。这是使用以下代码:

selectElements.sort(function(a,b){
    return b.getAttribute('tabindex')-a.getAttribute('tabindex');
});

我相信问题可能源于没有 getAttribute 的元素返回 null 的事实,但我知道什么......:P

让我知道你们会做些什么来完成这项工作......谢谢!

4

2 回答 2

1

改进@3dgoo 的答案,排序方法应该首先检查是否相等:

selectElements.sort(function(a, b) {
    a = a.getAttribute('tabindex');
    b = b.getAttribute('tabindex');

    if (a === b) {
        return 0;
    } else if (a === null) {
        return -1;
    } else if (b === null) {
        return 1;
    }

    return a < b ? -1 : 1;
}); 
于 2012-11-05T03:38:24.627 回答
0

首先,您的排序功能是错误的,将首先返回最大的 tabindex。要返回按 tabindex 升序排序,您需要这样:

selectElements.sort(function(a,b){
    return a.getAttribute('tabindex') - b.getAttribute('tabindex');
});

注意ab变量是互换的。

这不考虑具有 null tabindex 属性的元素,因此您希望在排序算法中为这些情况制定一些特殊规则:

selectElements.sort(function(a, b) {
    if (a.getAttribute('tabindex') === b.getAttribute('tabindex')) {
        return 0;
    }
    if (b.getAttribute('tabindex') === null) {
        return -1;
    }
    if (a.getAttribute('tabindex') === null) {
        return 1;
    }
    return a.getAttribute('tabindex') - b.getAttribute('tabindex');
});

这是一个测试这一切的jsfiddle。如果您愿意,可以玩一下:http:
//jsfiddle.net/snyL8/1/

根据我的发现,Chrome 或 Firefox 与我的或您的代码没有区别。

于 2012-11-05T03:27:43.430 回答