2010-05-26 70 views
4

我有一個超過100個列表項的表格,我必須重新排序時提交。以下代碼可用於重新排列我的列表,而不會在Firefox中出現任何明顯問題;但是,IE提示信息「此頁面上的腳本正在導致Internet Explorer運行緩慢,如果它繼續運行,您的計算機可能會無響應,您是否要中止腳本?」如果用戶點擊「否」,該腳本將按預期工作。IE 8提示用戶「慢」jQuery腳本

var listitems = $(form).find('li').get(); 
listitems.sort(function(a, b) { 
    var compA = $(a).attr('id'); 
    var compB = $(b).attr('id'); 
    return (compA - compB); 
}); 

關於如何提高效率的任何想法?

+1

你可以在服務器端做到這一點嗎?那麼IE8不會抱怨。 – Anthony 2010-05-26 05:48:36

+0

是的,我想我可以,如果我必須。不過不是一個壞主意!謝謝。 – Jason 2010-05-26 05:56:29

+1

嘗試在排序時緩存id屬性 – Bishnu 2010-05-26 06:36:04

回答

5

我沒有100項嘗試,但它完全有2

listitems.sort(function(a, b) { 
    return (a.id - b.id); 
}); 
+0

每比較*創建兩個jQuery對象*對於較大的排序非常緩慢,並且刪除這兩個構造可能會顯着加快速度。 – strager 2010-05-26 07:26:07

+2

在Safari上,這對於包含100個元素的列表提供了84倍的改進。 – Anurag 2010-05-26 10:26:27

+0

謝謝安迪!這很好。 – Jason 2010-05-26 19:30:31

1

您的代碼建議您的ID是數字,這在HTML中無效。你應該改變你的設計。此外,你可以非常簡單地做到這一點,沒有jQuery,性能更好。

以下假設您的ID的格式爲「li_x」,其中x爲整數。它沒有完全優化,因爲它在每次比較中調用提取數字ID的函數。如果您需要提高性能,您可以預先緩存數字ID,但我認爲這不足以保證它。

function getNumericId(li) { 
    return li.id.split("_")[1]; 
} 

var liList = form.getElementsByTagName("li"); 
var liArray = Array.prototype.slice.call(liList, 0); 
liArray.sort(function(a, b) { 
    return getNumericId(a) - getNumericId(b); 
}); 
+0

是的,你是對的。這些ID是數字。感謝您指出了這一點!我想我忘了ID不能是數字。 – Jason 2010-05-26 19:28:04

2

使用了幾種不同的方法,並針對不同的瀏覽器獲得了有趣的結果。不幸的是,像往常一樣煩人的瀏覽器是我無法訪問的瀏覽器。如果有人能評論這些測試如何在IE上運行,我將不勝感激。

Chrome上完全刪除了jQuery的使用並沒有太大的收穫,但是跳過jQuery在其他瀏覽器上有更好的結果。此外,隨着<li>元素的數量增加,它有助於構建一個只有id的數組並排序。排序完成後,使用此數組可以使用排序後的ID數組以正確的順序獲取節點數據。

排序列表項的數組。

function sortListItems() { 
    var listItems = $("li").get(); 

    listItems.sort(function(a, b) { 
     return a.id - b.id; 
    }); 
} 

對ID數組進行排序。

function sortIDs() { 
    var listItems = $("li"); 
    var ids = []; 
    for(var i = 0; i < listItems.length; i++) { 
     ids.push(listItems[i].id); 
    } 

    ids.sort(function(a, b) { 
     return a - b; 
    }); 
} 

查看結果在http://jsfiddle.net/hwxmJ/4/。由於某種原因,Safari瀏覽器出現了1000個項目,而另外一些 - Chrome,Opera,Firefox在2000個元素上運行良好。

+0

感謝您對此進行測試!令人敬畏的工作! – Jason 2010-05-26 19:40:04