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.sender
là null
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.
Nguồn
2011-08-19 19:31:47
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
@ 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.) –
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