2012-05-30 34 views
9

我有一個表,我加載通過jQuery加載命令。在加載函數的回調中,我啓動了tablesorter插件。出於某種原因,該表只按降序排列而不是升序排列。即使更奇怪,如果我按住Shift鍵,它會在asc和desc之間正確切換?任何想法這裏發生了什麼?jquery tablesorter ajax表只排序一個方向

table.php

<table id="xyz"> 
<thead> 
    <tr> 
     <th>hi</th> 
    </tr> 
</thead> 
<tbody> 
    <tr> 
     <td>a</td> 
    </tr> 
    <tr> 
     <td>b</td> 
    </tr> 
    <tr> 
     <td>c</td> 
    </tr> 
</tbody> 
</table> 

jQuery的

$("#myDiv").load("table.php", function() { 
    $("#xyz").tablesorter(); 
}); 

,如果我不按預期加載通過AJAX的表,則使用的tablesorter功能。

+0

如果我點擊得非常快,它看起來好像按升序排序,但是然後再降序排列。 –

+3

你是否在文件的其他地方聲明瞭'.tablesorter()'?你可能是雙重綁定... – Jason

+0

好的想法,但沒有我只打電話.tablesorter()一次 –

回答

9

好吧,所以我像Jason想的那樣具有雙重約束力。

我實際上是在一個類上調用jQuery的加載函數,而我的頁面上有兩個div。所以它實際上是兩次調用回調函數?

我認爲這是一種奇怪的行爲,因爲被加載到兩個div的內容是相同的,但它看起來像jQuery爲每個div做單獨的ajax調用。感謝您的意見!

+0

我有同樣的問題,我正在加載兩個版本的jQuery。你的問題讓我弄明白了,謝謝 –

1

問題已經解決,但我會提到我有同樣的問題。原因是在舊版本的jQuery中:我有1.4.2,需要1.4.4。

5

只是想我會在這裏拋出另一個答案,以防其他人遇到這種情況。當我嘗試使用類選擇器而不是id選擇器在表上調用.tablesorter()時,發生了這種情況。所以從

$('.tablesorter').tablesorter();

改變它

$('#tablesorter').tablesorter();

(和標記,以反映這個)修正了這個問題對我來說。

5

再次看到如何解決這個問題,我想分享一下我的不同場景。

我的表體的行是從.ajax呼叫動態創建的,一旦用戶添加/修改/刪除的行,則該表體的行是.removed()並且經由function()相同.ajax呼叫重新創建。這當然會因爲表頭保持不變而雙重綁定tablesorter,這會導致奇怪的行爲。

對我來說,修復是對的tablesorter解除綁定初始化$('#mytable').addClass('tablesorter').tablesorter();像這樣前:

$('#mytable') 
    .unbind('appendCache applyWidgetId applyWidgets sorton update updateCell') 
    .removeClass('tablesorter') 
    .find('thead th') 
    .unbind('click mousedown') 
.removeClass('header headerSortDown headerSortUp'); 

另一個補丁可能在.ajax呼叫,而不只是身體<tr>的創建整個表。

希望這有助於

+0

正確答案,因爲我無法在插件文檔中找到刪除上一個綁定的方法。 – AdityaSaxena

1

我有同樣的問題,而是一個不同的設置,並在此線程指出,答案沒有解決我的問題。爲我的方案添加解決方案,以防別人遇到同樣的問題。

我的表體行是從頁面加載時的.ajax調用動態創建的,並且一列設置爲默認的sortList以在數據加載後進行排序。

根據提交新的日期範圍重新填充10列中的5列。我不重建表體,而是將數據注入適當的記錄,然後根據我的默認sortList進行度量。

我的問題是,在提交新的日期範圍後,tablesorter現在在頭文件中定義了兩次,因此單擊頭文件將進行兩次排序,看起來只能按一種方式排序。

我的解決方案是防止tablesorter頭被初始化兩次。在頁面加載,我讓的tablesorter排序的一個專欄中,我sortlist中的屬性我設置設置,但每一個新的日期範圍submited,我的用戶以下行進行排序的數據加載後我的專欄:

$('#mytableBody').trigger("update"); 
var sorting = [[5, 1]]; 
setTimeout(function() {$('#mytableBody').trigger('sorton', [sorting]) }, 1); 

我使用的setTimeout以確保數據在排序前完全加載。

希望這會有所幫助。