2

JavaScript での並べ替えにはかなり奇妙な問題があります。私は、この驚くほど恐ろしく紛らわしい並べ替えの世界に迷い込んでしまいました。

基本的に、私は tabindex HTML 属性を模倣しようとしています。これは、基本的にページ内の「タブ移動」の順序を変更します: tabindex を持つ要素が最初で、最小の正の数が最初で、下に移動し、tabindex のない要素が最後になります。変わらない順番で。したがって、次のようになります。

tabindex=1、tabindex=2、tabindex=5、tabindex=5000、tabindex なし、tabindex なし、tabindex なしなど...

私はこれを機能させようとしています。Chrome では、他のすべての主要なブラウザーと比較して、使用する並べ替えアルゴリズムが原因で (少なくとも私はそう思います)、機能しません。

Chrome で返されるのは散発的で奇妙なもので、1 つの要素が完全に順不同で、他の要素が最下部ではなく上部に表示されます。

他のすべてのブラウザーでは、それは機能します (ただし、tabindex の要素が逆の順序になっていることを除きますが、これを機能させた後に修正することを計画していたのは非常に簡単です)。これは次のコードを使用しています。

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

問題は、getAttribute のない要素が null を返すという事実に起因する可能性があると思いますが、私は何を知っていますか... :P

これを機能させるために皆さんが何をするか教えてください...ありがとう!

4

2 に答える 2

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;
}); 
于 2012-11-05T03:38:24.627 に答える
0

まず、並べ替え関数が間違った方法であり、最初に最大のタブインデックスを返します。タブインデックスの昇順で並べ替えを返すには、次のようにします。

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 と私のコードまたはあなたのコードに違いはありませんでした。

于 2012-11-05T03:27:43.430 に答える