2011-08-19 25 views
11

Tôi có danh sách video có thể sắp xếp và một nhóm video có thể kéo được. Về cơ bản, tôi muốn đảm bảo rằng video được kéo vào không nằm trong 5 phút đầu tiên của video. Khi độ dài video khác nhau, tôi muốn kiểm tra điều này trên thả - thêm thời gian lên đến sau đó và nếu không 5mins trở lại và hiển thị một lỗi.jQuery Draggable + Sortable - Làm thế nào để từ chối một thả vào sắp xếp?

Tôi đã cố gắng móc vào tất cả các cuộc gọi lại cho kéo và sắp xếp (bao gồm cả gọi lại hoàn nguyên không có giấy tờ) để làm bài kiểm tra của tôi nhưng bất cứ điều gì tôi thử, luôn luôn thay đổi (và có thể sắp xếp cuộc gọi gọi lại ...

Có ai có đề xuất nào không?

Trả lời

10

Bạn có thể hoàn nguyên hoạt động kéo bằng cách gọi phương thức cancel của tiện ích draggable (phương pháp đó không có giấy tờ nhưng tên của nó không bắt đầu bằng dấu gạch dưới). Tuy nhiên, nó chỉ hoạt động trong sự kiện start vì các sự kiện khác xảy ra quá muộn để kích hoạt hoạt ảnh hoàn nguyên.

Tuy nhiên, widget sortable vẫn đăng ký lần thả ngay cả khi thao tác kéo bị hủy bỏ, vì vậy bạn cũng phải loại bỏ các mục mới được thêm vào (trong trường hợp stop, như trường hợp start xảy ra quá sớm):

$("#yourSortable").sortable({ 
    start: function(event, ui) { 
     if (!canDropThatVideo(ui.item)) { 
      ui.sender.draggable("cancel"); 
     } 
    }, 
    stop: function(event, ui) { 
     if (!canDropThatVideo(ui.item)) { 
      ui.item.remove(); 
      // Show an error... 
     } 
    } 
}); 

Bạn có thể xem kết quả trong this fiddle (mục thứ tư sẽ luôn hoàn nguyên).

Cập nhật: Như John Kurlak chính đáng chỉ ra trong các ý kiến, các mặt hàng không trở lại vì cuộc gọi đến draggable("cancel"), nhưng vì ui.sendernull trong trường hợp của chúng tôi. Ném bất cứ điều gì kết quả trong cùng một hành vi.

Than ôi, tất cả các kết hợp khác tôi đã cố gắng kết quả trong mục được quay trở mà không có hình ảnh động đang diễn ra, như vậy có lẽ lựa chọn tốt nhất của chúng tôi là để tránh truy cập vào ui.sender và thay vào đó viết một cái gì đó như:

start: function(event, ui) { 
    if (!canDropThatVideo(ui.item)) { 
     throw "cancel"; 
    } 
} 

Trường hợp ngoại lệ còn tự do vẫn sẽ xuất hiện trong giao diện điều khiển.

+0

Hey Cảm ơn bạn đã trả lời! Im đấu tranh để có được nó để làm việc mặc dù - các thử nghiệm (canDropThatVideo) cần phải tìm vị trí nó đang được giảm xuống trong danh sách để nó có thể so sánh với các video lân cận. Tôi đã thử một cái gì đó như: // lấy các vids liền kề var nextVid = $ (ui.item) .next(); var prevVid = $ (ui.item) .prev(); nhưng những dường như không nhận được những cái đúng - có lẽ bởi vì nó trong sự kiện bắt đầu ... Có nên làm việc? – lopsided

+0

@ user612911, nó phức tạp hơn nhưng nó có thể hoạt động. Bạn phải liên kết với sự kiện 'sort' thay vì' start' và sử dụng 'ui.placeholder.next()' và 'ui.placeholder.prev()', tương ứng. Bạn cũng có thể phải nhớ quyết định của bạn về mục này bằng cách nào đó (có thể với 'data()'), để xử lý 'stop' biết phải làm gì. (Ngoài ra, bạn không cần phải gọi '$()' trên các thành viên 'ui': chúng đã là các đối tượng jQuery.) –

+0

Tuyệt vời, tôi có nó hoạt động tốt ngay bây giờ.Tôi cũng gắn một số logic vào sự kiện 'start' của draggable để thêm một số lớp 'cantDropHere' vào các phần tử không phải là các vùng thả hợp lệ và sau đó loại trừ các lớp đó khỏi phân loại. Cảm ơn! – lopsided

3

Tôi đã tìm thấy một cách khác. Nếu bạn không nhớ rằng không có hoạt ảnh của nó trôi nổi về vị trí ban đầu, bạn luôn có thể sử dụng số này

.droppable({ 
    drop: function (event, ui) { 

     var canDrop = false; 

     //if you need more calculations for 
     //validation, like me, put them here 

     if (/*your validation here*/) 
      canDrop = true; 

     if (!canDrop) { 
      ui.draggable.remove(); 
     } 
     else{ 
      //you can put whatever else you need here 
      //in case you needed the drop anyway 
     } 
    } 
}).sortable({ 
    //your choice of sortable options 
}); 

tôi đã sử dụng điều này vì tôi cần sự kiện thả.

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