对空值和数字进行排序以模仿tabindex HTML属性功能

时间:2012-11-04 20:37:50

标签: javascript html google-chrome sorting tabindex

我在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

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

2 个答案:

答案 0 :(得分:1)

改进@ 3dgoo的答案,sort方法应首先检查相等性:

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;
}); 

答案 1 :(得分:0)

首先,你的排序函数是错误的方法,并将首先返回最大的tabindex。要按升序tabindex顺序返回排序,您需要这样:

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

请注意 a b 变量已切换。

这不会考虑具有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与我或您的代码没有区别。