我在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
让我知道你们会做些什么来完成这项工作......谢谢!
答案 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与我或您的代码没有区别。