2010-01-06 46 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