2011-07-29 20 views
0

我有一堆<div>元素,其中每个元素都有一个name。我想查询使用jQuery的<div>元素,但我希望它们按照name的字母顺序排列。常用代码查询一组元素,但以特定顺序

$("div").doStuff() 

不以任何特殊顺序返回元素。

+0

实际上,它按照它们在文档中出现的顺序返回元素 – yitwail

回答

3
$($("div").get().sort(function(a,b){ 
    if($(a).attr("name") === $(b).attr("name")) 
     return 0; 
    return $(a).attr("name") < $(b).attr("name") ? -1 : 1; 
})).each(function(){ $(this).doStuff(); }); 
+0

其实不行。第二个'$()'调用会破坏之前完成的排序。 – Randomblue

+0

@Randomblue嗯有趣的知道。我改变了它,使它现在保持为一个数组。 – Paulpro

+0

@Randomblue它确实有效。我只是有一个错误,并直接比较a和b而不是它们的名称属性。它现在工作:) http:// jsfiddle。网/ Paulpro/PrfZy/ – Paulpro

3

除了将元素列表获取到一个普通的JS数组中,按名称对数组进行排序,将它们放回到一个jQuery对象中,然后在该排序中调用它们的最终操作之外,订购。

function compareNameAlpha(a, b) { 
    var n1 = a.getAttribute("name"); 
    var n2 = b.getAttribute("name"); 

    if (n1 < n2) return(-1); 
    if (n1 == n2) return(0); 
    return(1); 
} 

var elArray = $("div").toArray().sort(compareNameAlpha); 
$(elArray).doStuff(); 

或做了所有在一行:

$($("div").toArray().sort(compareNameAlpha)).doStuff(); 

工作演示在这里:http://jsfiddle.net/jfriend00/qeLfX/


编辑:似乎有这样做,因为jQuery的一个更简单的方法直接支持.sort()(尽管它仅在内部使用时标记在jQuery源代码中)。你可以这样做:

$("div").sort(compareNameAlpha).each(doStuff); 

看到那个版本在这里http://jsfiddle.net/jfriend00/hJhhf/

+0

Yuck!这很糟糕。 – Randomblue

+0

是的,它很糟糕,但没有其他办法可以做到。你不能“查询”DOM元素。您只能选择它们并使用它们的内容和属性。我相信你可以找到一个jQuery插件来帮助你。 –

+0

@ jfriend00其实不行。 '$(elArray)'中的'$()'破坏了之前完成的排序。 – Randomblue

1

下面的代码是未经测试,但我认为你可以沿着以下的线路做一些事情:

$($("div").get().sort(sortFn)).each(doStuff); 

哪里sortFnArray.sort的适当参数,它按名称属性对元素进行排序。

+0

其实不行。第二个'$()'调用会破坏之前完成的排序。 – Randomblue

+0

@Randomblue,我确信它确实有效; '.each'保留订购。此外,PaulPRO的jsfiddle正是如此,它的工作正确。 –

+1

事实上,第二个'$()'查询无法破坏先前完成的排序,因为您只查询单个元素(一个数组)。你不能销毁只有一个元素。 –