2010-03-27 33 views
12

我已經設置了一個jQuery可排序列表,但我需要能夠將某些項目保留在可排序的「固定」位置,並對其他項目進行排序在他們旁邊。我認爲會建立方法來實現這一點,但事實並非如此。強制項目在jQuery UI中保留原狀可排序列表

我能夠設置列表,不包括有問題的項目:

<ul id="fruit"> 
    <li class="fixed">apples</li> 
    <li>oranges</li> 
    <li>bananas</li> 
    <li>pineapples</li> 
    <li>grapes</li> 
    <li class="fixed">pears</li> 
    <li>mango</li> 
</ul> 

<script type="text/javascript"> 
    $('#fruit').sortable({items: "li:not('.fixed')"}) 
</script> 

這將停止從我拖/丟棄這些物品,但如果他們周圍的項目進行排序,他們仍然移動。可能有一種方法可以使用此方法具有的許多回調來完成此操作,但我一直無法解決這個問題。

也許這種方法將是一個很好的除了UI排序選項?

+0

我可以看到它們是否全部位於列表的頂部或底部 - 但我不得不想知道如果按照列表排序,它將如何工作 - 梨是否仍然是最後一個,或者是固定的與之前的關係(我可以看到第二個用戶的用途,想不到第一個用戶的情況)?有人可以將芒果拖到梨上方,然後對其進行分類,現在梨會留在列表中嗎? – Joe 2010-03-27 14:36:05

+0

他們會留在相同的位置(索引),只有他們周圍的物品會改變。我問了一個問題 http://stackoverflow.com/questions/2519103/how-can-i-sort-an-array-yet-exclude-certain-elements-to-be-kept-at-the-same- pos 這有一個類似的主題(雖然在這種情況下,簡單地排序數組) - 但是原理是相同的 – calumbrodie 2010-03-28 01:24:09

回答

4

我設法通過修改抖動做到這一點編碼一下,然後附加到「更改」事件而不是「停止」。我通過查看拖動項目時索引如何變化並設置一些條件來做到了這一點。它也適用於多個固定元素。 「lockto」變量定義了固定元素的位置,固定元素最初應該在這個位置。你可能可以重寫這個並將其包裝在一個函數中,所以你不需要爲所有固定元素手動設置「lockto」變量。

$("#sortable").sortable({ 
    "cancel":"li.static", 
    "change":function(event,ui) { 
     var lockto = 6; 
     var thisindex = $(ui.helper).index(fixed);   
     var fixed = $("#static-"+lockto);   
     var index = $("#sortable li").index(fixed); 
     var targetindex = lockto+1; 
     if(index !== targetindex) {   
      if(index > targetindex) { 
       fixed.prev().insertAfter(fixed); //move it up by one position 
      } else if(index==(targetindex-1) && thisindex>targetindex) { 
       //don't move it at all 
      } else { 
       fixed.next().insertBefore(fixed); //move it down by one position 
      } 
     } else if(index==targetindex && thisindex>targetindex) { 
      fixed.prev().insertAfter(fixed); //move it up by one position 
     }  
    } 
}); 
+0

感謝您的回覆 - 當我得到一個備用的10分鐘後,我會嘗試進行測試;-) – calumbrodie 2010-10-07 14:28:37

+0

@tester測試人員感謝您的代碼在單個固定元素上工作正常,但對於多個固定元素無法正常工作。 請檢查鏈接http://jsfiddle.net/shuklendu/hP4rm/4/ 在上面的鏈接我想項目2,項目4和項目6應保持在他們的位置,同時排序。 將項目7拖向項目1並檢查項目4和項目6將改變其位置。 – shuklendu 2011-12-14 07:34:23

1

我猜這不是微不足道的。爲了您的例子,它仍然有一些工作是可行的(一個通用的解決方案將是一個有點困難)

檢查http://jsbin.com/etubi/2用於演示(http://jsbin.com/etubi/2/edit的代碼)

$("#sortable").sortable({ 
    cancel: "li.fixed", //exclude fixed ones 
    stop:function(event, ui) { 
     //nothing to do for #f0 as you can't sort anything above it 
     var f5 = $("#f5"); 
     var indf5 = $("#sortable li").index(f5); 
     //if f5 not in right position -> swap position 
     if(indf5 !== 5) { 
      if(indf5 > 5) { 
       f5.prev().insertAfter(f5); //move it up by one position 
      } else { 
       f5.next().insertBefore(f5); //move it down by one position 
      } 
     } 
    } 
}); 
+0

謝謝你的回答。 該解決方案適用於我,但仍然存在在排序過程中出現移動項目的問題(排序完成時已修復)。 A *完美*解決方案意味着該項目在進行排序時保持固定(視覺)。隨着事件處理程序的數量可用,我認爲這可能是可能的。 – calumbrodie 2010-03-28 01:32:11

-2

您可以使用排序選項 「取消」

例:

$("#sortable").sortable({ 
    cancel: "li.group_elem" 
}); 

這樣一來,有 「group_elem」 類li元素,不會排序。

+0

這並沒有解決這個問題,它只是防止它被拖拽 – musefan 2015-07-24 13:07:34

+0

拉杜,只是刪除這個答案,你會得到你的聲望點。 – SeanKendle 2015-10-14 15:58:54

相關問題