-2

以下のコードを参照してください

source = $("<root><item desc='SQL'/><item desc='Microsoft'/><item desc='Action Script'><item desc='Java script'></root>")

//WAY 1: This way is not working...
source.children().sort(function(a, b)
    {
        var aText = $(a).attr("desc").toLowerCase();
        var bText = $(b).attr("desc").toLowerCase();

        if(aText == bText)
            return 0;

        return aText > bText ? 1 : -1;
    });

alert(source[0].outerHTML);

//WAY 2: This is working...
var temp = source.children();

temp.sort(function(a, b)
    {
        var aText = $(a).attr("desc").toLowerCase();
        var bText = $(b).attr("desc").toLowerCase();

        if(aText == bText)
            return 0;

        return aText > bText ? 1 : -1;
    });

source = $("<root/>");
source.append(temp);

alert(source[0].outerHTML);

方法1は機能しておらず、方法2は正常に機能しています。子を別の変数に割り当ててから並べ替えて、元の変数に戻す必要があるのはなぜですか?これは正しく効率的な方法ですか?

このFIDDLEを試すことができます...。

4

1 に答える 1

2

jQuery コレクション内の子の順序は、XML ノードとしての子の順序とは関係ありません。jQuery コレクションでは、それらはノードへの単なるポインタです。2 番目の例では、それらを新しい順序で新しいルートに追加しています。

類推: たくさんの野球選手とその野球カードがあると想像してください。野球選手を打順で並べてから、選手と同じ順番でカードを並べます。

最初の例では、野球カードを並べ替えているだけです。選手自身は動かない。

2 番目の例では、カードを並べ替えてから、カードを並べ替えたのと同じ順序で新しい行に移動するようプレーヤーに指示します。

于 2012-10-12T07:38:43.753 に答える