2010-02-15 31 views
15

Tôi không thể tìm hiểu cách lấy phần tử đích với jQuery UI có thể sắp xếp.jQuery có thể sắp xếp lấy 2 phần tử được hoán đổi

$("#pages").sortable({ 
     opacity: 0.6, 
     update: function(event, ui) { 
      var first = ui.item; // First element to swap 
      var second = ???? // Second element to swap 
      swapOnServer(first, second); 
     } 
    }); 

Tất cả các tùy chọn Tôi đã thử điểm đến nguyên tố này được rê đến, nhưng không phải là người nó được hoán đổi với: ui.item[0], event.srcElement, event.toElement.

Ngoài ra, this trỏ đến phần tử LIST (OL).

Nói thứ hai Ý tôi là như sau:

gốc trật tự là:

| 0 | | 2 | |

Chúng tôi kéo yếu tố 1 và thả nó ở vị trí 3. Mà sẽ kết thúc với:

| 0 | | 2 | |

Vì vậy, phần tử đầu tiên là 1 và phần tử thứ hai là 3 (WRONG! Xem bên dưới).

CẬP NHẬT: Tôi đã nhận ra rằng tôi đã hiểu sai. Thứ tự mới trong trường hợp này sẽ là.

| 0 | 2 | 3 | |

Kết quả là câu hỏi của tôi không thực sự hợp lý. Cảm ơn tất cả mọi người đã giúp đỡ. Tôi sẽ đánh dấu bỏ phiếu và đánh dấu một câu trả lời.

Vì vậy, câu hỏi đặt ra là làm thế nào để có được phần tử thứ hai ở đây?


CÁC CÁCH GIẢI QUYẾT HIỆN (như không có hạn như trao đổi trong sắp xếp được) dưới đây. Nó sử dụng mảng tạm thời với các đơn đặt hàng.

var prevPagesOrder = []; 
    $("#pages").sortable({ 
     start: function(event, ui) { 
      prevPagesOrder = $(this).sortable('toArray'); 
     }, 
     update: function(event, ui) { 
      var currentOrder = $(this).sortable('toArray'); 
      var first = ui.item[0].id; 
      var second = currentOrder[prevPagesOrder.indexOf(first)]; 
      swapOnServer(first, second); 
     } 
    }); 

Xin cảm ơn,
Dmitriy.

+3

@Dimitriy, không có "mục thứ hai" để nó khiến câu hỏi của bạn vô cùng không rõ ràng. Nếu bạn cho phép người dùng nhặt và thả một mục ở bất kỳ đâu trong danh sách, nó chỉ đơn thuần là chuyển các chỉ mục để nhường chỗ cho nó. Chỉ khi anh ta di chuyển nó lên một nơi lên hoặc xuống, thì chỉ có hai mục bị ảnh hưởng. Nhưng nếu anh ta lấy nó từ đầu danh sách, và thả nó sau ba mục tiếp theo, ba vị trí đầu tiên đó đều bị ảnh hưởng bởi sự di chuyển. Không có "chuyển đổi" đã xảy ra. Xin vui lòng mô tả chi tiết hơn những gì bạn cần phải hoàn thành. –

+0

Phương thức 'swapOnServer' như thế nào? –

+0

đã thử giải pháp, dường như dòng này: 'var second = currentOrder [prevPagesOrder.indexOf (đầu tiên)];' nên là 'var second = prevPagesOrder [currentOrder.indexOf (đầu tiên)];' –

Trả lời

5

Thực sự không có mục "thứ hai". Bạn có một mục, và bạn chỉ đơn giản là đặt nó ở một vị trí khác.Các mục xung quanh nó điều chỉnh vị trí của chúng cho phù hợp. Nếu bạn muốn nhận một mảng của tất cả các mục, bạn có thể sử dụng phương thức toArray.

6

Hãy thử sử dụng hàm serialize cung cấp cho bạn một hàm băm trong danh sách các mục theo thứ tự.

Nếu bạn chỉ cần mục mà mục mới đi bỏ trước khi bạn có thể làm điều này:

$("#pages").sortable({ 
    opacity: 0.6, 
    update: function(event, ui) { 
     var first = ui.item; // First element to swap 
     var second = ui.item.prev(); 
     swapOnServer(first, second); 
    } 
}); 

thứ hai sẽ được null nếu nó vào lúc bắt đầu của danh sách.

+0

Không có nhiều điều tôi có thể làm với toàn bộ danh sách. Tôi chỉ cần 2 mục đã được đổi chỗ để tôi có thể đăng thay đổi lên máy chủ. Tôi không cần phải đăng lên máy chủ toàn bộ danh sách trao đổi chỉ có 2 mục. –

+0

Tôi nghĩ Dmitriy đang đề cập đến jQuery UI Sortable, bạn đang đề cập đến phần tử Giao diện có thể sắp xếp. – Ben

+0

Cập nhật câu trả lời của tôi để chỉ cho bạn cách lấy vật phẩm trước khi vật phẩm bị rơi. – PetersenDidIt

6

hãy nhìn vào các "thể thay" jQuery plugin:

http://plugins.jquery.com/project/Swapable

Nó tương tự như "Sortable", nhưng chỉ có hai yếu tố của nhóm đã chọn bị ảnh hưởng: yếu tố kéo và thả một trong đó được đổi chỗ . Tất cả các yếu tố khác đều ở vị trí hiện tại của chúng. Plugin này được xây dựng dựa trên plugin jQuery "Sắp xếp" hiện có và kế thừa tất cả các tùy chọn có thể sắp xếp.

+0

nó là tốt nhất! Tôi muốn lưu ý cho bất kỳ ai đang cố gắng cập nhật mã của họ từ có thể sắp xếp thành có thể hoán đổi được rằng RẤT QUAN TRỌNG là cả hai đều xác định các mục bạn muốn kéo một cách rõ ràng VÀ vị trí con trỏ nằm ngoài giới hạn của phần tử đã kéo của bạn, như sau: '$ ('# my-list'). swappable ({items: 'li', cursorAt: {top: -10}});' nếu không nó sẽ không hoạt động –

+0

Nhưng nó hút rằng bạn phải cài đặt một plugin khác – Donato

6

Bạn có thể sử dụng draggabledroppable thay vì sortable để đạt swappable hiệu lực. Trong thực tế, điều này sẽ như sau:

(function() { 
    var droppableParent; 

    $('ul .element').draggable({ 
     revert: 'invalid', 
     revertDuration: 200, 
     start: function() { 
      droppableParent = $(this).parent(); 

      $(this).addClass('being-dragged'); 
     }, 
     stop: function() { 
      $(this).removeClass('being-dragged'); 
     } 
    }); 

    $('ul li').droppable({ 
     hoverClass: 'drop-hover', 
     drop: function (event, ui) { 
      var draggable = $(ui.draggable[0]), 
       draggableOffset = draggable.offset(), 
       container = $(event.target), 
       containerOffset = container.offset(); 

      $('.element', event.target).appendTo(droppableParent).css({opacity: 0}).animate({opacity: 1}, 200); 

      draggable.appendTo(container).css({left: draggableOffset.left - containerOffset.left, top: draggableOffset.top - containerOffset.top}).animate({left: 0, top: 0}, 200); 
     } 
    }); 
}()); 

Demo, http://jsfiddle.net/FZ42C/1/.

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