2010-03-27 29 views
12

Tôi đã thiết lập danh sách có thể sắp xếp jQuery nhưng tôi cần có thể giữ một số mục có thể sắp xếp 'cố định' tại chỗ và cho các mục khác sắp xếp xung quanh chúng. Tôi nghĩ rằng sẽ có những phương pháp để đạt được điều này, nhưng đây không phải là trường hợp.Bắt buộc phải giữ một mục trong danh sách Giao diện người dùng jQuery

tôi có thể thiết lập danh sách và không bao gồm các mục trong câu hỏi:

<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> 

này đang ngăn cản tôi từ kéo/thả các mặt hàng này nhưng họ vẫn di chuyển nếu các mục xung quanh họ đều được sắp xếp. Có thể có một cách để làm điều này bằng cách sử dụng nhiều callbacks rằng phương pháp này có nhưng tôi đã không thể làm việc này ra.

Có lẽ phương pháp này sẽ là một bổ sung tốt cho các tùy chọn Giao diện người dùng có thể sắp xếp?

+0

Tôi có thể thấy tất cả chúng ở đầu hoặc cuối danh sách - nhưng tôi phải tự hỏi nó sẽ hoạt động như thế nào nếu bạn sắp xếp với danh sách của mình - lê sẽ vẫn đứng thứ hai từ cuối cùng hoặc cố định trong mối quan hệ với một trước khi nó (tôi có thể thấy một sử dụng cho một thứ hai, không thể nghĩ ra một tình huống cho người đầu tiên)? Ai đó có thể kéo xoài trên quả lê, và sau đó sắp xếp nó, sẽ lê bây giờ ở cuối trong danh sách? – Joe

+0

Họ sẽ ở trong cùng một vị trí (chỉ mục) và chỉ các mục xung quanh họ sẽ thay đổi. Tôi đã đặt câu hỏi http://stackoverflow.com/questions/2519103/how-can-i-sort-an-array-yet-exclude-certain-elements-to-be-kept-at-the-same- pos Điều đó có một chủ đề tương tự như thế này (mặc dù trong trường hợp đó, chỉ đơn giản là sắp xếp mảng) - tuy nhiên nguyên tắc là giống nhau – calumbrodie

Trả lời

4

tôi quản lý để thực hiện điều này bằng cách sửa đổi bồn chồn mã một chút và đính kèm nó vào sự kiện "thay đổi" thay vì "dừng". Tôi đã làm điều đó bằng cách xem cách chỉ mục thay đổi khi kéo một mục xung quanh và thiết lập một số điều kiện. Nó cũng hoạt động với nhiều phần tử cố định. Biến "lockto" xác định vị trí của phần tử cố định và phần tử cố định phải ở vị trí này ban đầu. Bạn có lẽ có thể viết lại nó và bọc nó trong một hàm để bạn không cần phải tự đặt biến "lockto" cho tất cả các phần tử cố định.

$("#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

Cảm ơn phản hồi của bạn - Tôi sẽ cố gắng kiểm tra điều này khi tôi nhận được 10 phút ;-) – calumbrodie

+0

@tester testers Cảm ơn mã của bạn đang hoạt động tốt với một phần tử cố định nhưng nó không hoạt động tốt với nhiều phần tử cố định. vui lòng kiểm tra liên kết http://jsfiddle.net/shuklendu/hP4rm/4/ Trong liên kết ở trên, tôi muốn khoản 2, mục 4 và mục 6 phải được giữ nguyên vị trí của chúng trong khi sắp xếp. Kéo Mục 7 lên mục 1 và kiểm tra Mục 4 và Mục 6 sẽ thay đổi vị trí của chúng. – shuklendu

1

Điều này là không tầm thường tôi đoán. Ví dụ bạn nó vẫn còn khả thi với một công việc ít (một giải pháp chung sẽ là một chút khó khăn hơn)

Kiểm tra http://jsbin.com/etubi/2 cho một bản demo (http://jsbin.com/etubi/2/edit cho mã)

$("#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

Cảm ơn bạn đã trả lời. Giải pháp này sẽ làm việc cho tôi, tuy nhiên vẫn có vấn đề về các mục xuất hiện để di chuyển trong khi sắp xếp (được cố định khi sắp xếp xong). Một giải pháp * hoàn hảo * có nghĩa là mặt hàng vẫn cố định (trực quan) trong khi sắp xếp đang diễn ra. Với số lượng xử lý sự kiện có sẵn, tôi nghĩ rằng điều này có thể là có thể. – calumbrodie

0

Chúc các bạn đã xem câu hỏi này trước khi đăng bài và đã thực hiện tất cả nghiên cứu có thể sắp xếp. Đây có thể là một điểm khởi đầu tốt. Dù sao, đây là JQuery Sortable set item to an index programmatically một giải pháp chung cho vấn đề này.

-2

Bạn có thể sử dụng tùy chọn sắp xếp được "hủy"

Ex:

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

Bằng cách này, các yếu tố li có class "group_elem", sẽ không được sắp xếp.

+0

Điều này không sửa chữa mục tại chỗ, nó chỉ ngăn không cho nó bị kéo – musefan

+0

Radu, chỉ cần xóa câu trả lời này, bạn sẽ nhận được điểm danh tiếng của bạn trở lại. – SeanKendle

Các vấn đề liên quan