2017-09-22 106 views
0

我有一些部分工作,有兩個UL,都有jQuery UI .sortable()調用它。用戶可以並且可能應該將LI從一個放到另一個。我希望第二個列表真正可排序,但第一個列表保留單個排序,而不是在第二個列表中添加一個LI,如果用戶單擊該列表,則會在末尾添加LI。我看到了一個非常明顯的做法:保留LI的值的JavaScript列表,或者交替地設置一個data-index='0'(然後1,2,3等),然後在任何一種情況下創建一個單一的,可能是自下而上的,可怕的泡沫排序。是否有一個jQuery UI「反可排序」,可以讓LI從UL獲取,但始終指定順序?

這似乎是我可以直接得到的東西,但它有一個「如果你這樣做,你工作太低級」代碼味道給我。除了冒泡排序參考之外,在我認爲O(n)真的可以忍受的情況下,似乎某個知道jQuery UI的人可以產生更短更清晰的實現。

我上面列出瞭解決我的問題的難題。我應該考慮什麼簡單的方法。

+0

所以你想拖動一些靜態數據列表到另一個可以排序的列表? – epascarello

+0

是的,返回(或更簡單地移動項目只需點擊一下)。第二個UL最初爲空,具有用戶從第一個UL點擊或拖動的項目。這應該從第一個UL中刪除該項目。但是,如果用戶重新考慮並將項目從第二個UL移回到第一個UL,我希望新移動的元素返回到第一個UL中仍然(或再次)存在的項目中的原始位置第一個UL。 – JonathanHayward

+0

也許你想拖動,不可排序。 – epascarello

回答

0

稍微猶豫後,我決定採用明顯的解決方案,即使它不像通常的jQuery最佳解決方案。我在生成它們的服務器端代碼中添加了一個整數data-字段的升序整數,客戶端創建了一個單一的氣泡排序迭代函數,如果除最後一個項目以外的所有項目(最後添加的項目都是重新添加的)是爲了:

var get_index = function(node) 
    { 
    return parseInt(jQuery(node).attr('data-sort-position')); 
    }; 
var sort_available = function() 
    { 
    var len = jQuery('#available > li').length; 
    if (len >= 2) 
     { 
     var moved = false; 
     for(var index = 0; index < len; index += 1) 
      { 
      if (!moved) 
       { 
       if (get_index(jQuery('#available > li')[index]) > 
        get_index(jQuery('#available > li')[len - 1])) 
        { 
        var node = jQuery(
         jQuery('#available > li')[len - 1]).detach(); 
        jQuery(node).insertBefore(
         jQuery('#available > li')[index]); 
        moved = true; 
        } 
       } 
      } 
     } 
    }; 

我再補充一個sort_available()調用處理程序結束時點擊了其他目的地名單中的一員時被調用:

jQuery('#included li').click(function(event) 
     { 
     jQuery(event.target).detach(); 
     jQuery('#available').append(event.target); 
     assign_clicks(); 
     sort_available(); 
     }); 

現在,它似乎是把物品放回原來的位置。

相關問題