2010-01-06 44 views
0

我有一个HTML表是这样的:如何按特定顺序在jQuery中选择元素执行操作?

<table> 
<tr><td>X</td><td>X</td><td class='latest order1'>X</td><td class='latest order4'>X</td></tr> 
<tr><td>X</td><td>X</td><td class='latest order3'>X</td><td class='latest order2'>X</td></tr> 
<tr><td>X</td><td>X</td><td class='latest order6'>X</td><td class='latest order5'>X</td></tr> 
</table> 

现在,我要上运行latest类的所有对象jQuery的动作(Ajax调用),这是一个简单的:

$('.latest').each(do_call()); 

但由于阿贾克斯行动需要一些时间,我有这些元素的重要性排序。我想运行do_call()作为order1的对象,然后为order2元素,依此类推。

我如何排序jQuery对象,所以这些操作将以正确的顺序运行?

回答

1

首先,让所有的.latest元素及其顺序类的数组:

var order = []; 

$('.latest').each(function() { 
    // Get the order - all elements have class 'latest orderX': 
    // remove the 'latest', get the classname, and add the latest back. 
    order.push($(this).removeClass('latest').attr('class')); 
    $(this).addClass('latest'); 
}); 

然后对数组进行排序并遍历它,得到相应的元素:

order.sort(); 

for(var i in order) { 
    var obj = $('.latest.'+order[i]); 
    do_call(obj); 
} 

即使您的.latest元素没有按顺序编制索引,此方法仍然有效;例如。你可以在order1之后有order4,没有order2或存在,它仍然有效。

+0

为什么'.attr('class')'?有必要吗? – Mickel 2010-01-06 14:15:38

+0

嗯,是的,如果你想获得元素的类名。 – 2010-01-06 14:17:45

+0

好的,但不'attr'与'addClass'链接返回一个jQuery对象? – Mickel 2010-01-06 14:31:24

0

我认为你可以找到AJAX QUEUE plugin有用。从手册:

Ajax队列是一个插件,有助于管理Ajax竞争条件。当多个Ajax请求快速连续进行时,结果可能会被无序返回。这可能会在您的应用程序中造成奇怪的行为。 Ajax队列是一个插件(实际上是2个插件),提供了一种管理这些请求的方法。

1

这或许可以更有效,但它应该做的,你在找什么:

var latestItems = $('.latest'); 
var order = 1; 
for(var i = -1, len = latestItems.length; ++i < len) { 
    var item = $('.latest .order' + order); 
    doCall.call(item); 
    order++; 
} 
1

为什么不在一个'大'ajax调用中完成所有操作,而不是为每个元素运行单独的ajax调用?找出一种合并数据的方式,以便在服务器端将其分开,并让单个响应更新客户端上的元素。

+0

,因为如果一个ajax调用需要30秒到5分钟的时间,我更喜欢用更小的块来完成 - 只是为了能够更快速地更新并显示最重要部分的结果。 – kender 2010-01-06 14:19:47