Jquery排序不适用于children标签

时间:2012-10-12 07:26:48

标签: javascript jquery html jquery-ui-sortable

请参阅以下代码

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 ....

1 个答案:

答案 0 :(得分:2)

jQuery集合中子节点的顺序与子节点作为XML节点的顺序无关。在jQuery集合中,它们只是指向节点的指针。在第二个示例中,您将按新顺序将它们添加到新根目录。

一个类比:想象一下,你有一堆棒球运动员和他们的棒球卡。你按照击球顺序排列棒球运动员,然后你按照与球员相同的顺序排队。

在你的第一个例子中,你只是排序棒球卡。球员本身不动。

在你的第二个例子中,你对卡片进行排序,然后告诉玩家按照你将卡片分类的顺序移动到新的一行。