12

Używam JQuery 1.5.1 i JQuery UI 1.8.11.JQuery UI: Anuluj do sortowania po Droppable Drop

Dodałem możliwość sortowania dla wielu przedmiotów - zadaniem tutaj jest umożliwienie przeciągania do sortowania, wszystko działa dobrze.

Ale chcę włączyć droppable tak, że element może być upuszczony na „kopią mnie” obszar - zadanie nie będzie powielać element (będę pracować to trochę później)

problem to zrzucany cel znajduje się na dole listy do sortowania (nie chcę tego przenosić), a gdy pojawi się zrzut, sortowalny element przesuwa się na dół listy.

To, co chcę zrobić, to anulować sortowanie po uruchomieniu zdarzenia upuszczenia.

You can see my problem in action here (wystarczy przeciągnąć „pkt 1” na „drop do kopiowania pozycji” obszar i widać ten rodzaj nie zostanie anulowane)

Jak widać Próbowałem następujących w droppable „drop "zdarzenie (sugerowana z jQuery UI Docs), ale nie wydaje się do pracy ...

$(this).sortable('cancel'); 

Jestem również otwarty na wszelkie inne zalecenia dotyczące sposobu osiągnięcia tego«drop skopiować»efekt szukam.

Dzięki

+0

masz na myśli przez anulowanie? Anuluj spowoduje zatrzymanie sortowania i pozostawienie sortowanego miejsca dokładnie w miejscu, w którym je zostawiłeś. – jQuerybeast

+0

@jQuerybeast: Tak, tego właśnie chcę, "anuluj" zwróci przedmiot do oryginalnego miejsca. Tak więc w moim JSFiddle, jeśli spróbujesz skopiować przedmiot 1, kopia stanie się i pozycja 1 powinna powrócić na górę ... w momencie, gdy przesunie się na dół, jako ostatnia pozycja podświetlenia przed zdarzeniem upuszczenia. – musefan

+1

Anuluj nie " t działa z sortable, ale z przeciąganiem. W trybie sortowania można anulować/zatrzymać całą funkcję. – jQuerybeast

Odpowiedz

4

Ok, więc wypracowaliśmy rozwiązanie, które spełnia swoje zadanie.

kod anulowania działa, jeśli masz go w zdarzeniu "stop" funkcji do sortowania. Będzie jednak obowiązywać dopiero po zakończeniu "powrotu". Problem polega na tym, że próbowałem skopiować/przywrócić element ze zrzucanego zdarzenia "drop" i było to zbyt wcześnie.

Rozwiązaniem jest poczekanie, aż zdarzenie "stop" zostanie zakończone, i aby to osiągnąć, musiałem utworzyć flagę "oczekującej kopii", która zostanie sprawdzona w zdarzeniu "stop".

Here is an example

To nadal nie czuje się w prawo (UX-wise), ale działa poprawne, a zawsze można ustawić przywrócić false funkcję sortable uzyskać nieco lepszy dotyk.

Kod z przykładu jest następująca ...

var itemCount = 3; 
var awaitingCopy = false; 

$(init); 

function init() { 
    $("#Items").sortable({ 
     revert: true, 
     placeholder: "ItemPlaceHolder", 
     opacity: 0.6, 
     start: StartDrag, 
     stop: StopDrag 
    }); 

    $("#CopyItem").droppable({ 
     hoverClass: "CopyItemActive", 
     drop: function(event, ui) { 
      awaitingCopy = true; 
     } 
    }); 

    $("#NewItem").click(function(e) { 
     e.preventDefault(); 
     itemCount++; 
     var element = $("<div class='Item'>Item " + itemCount + "</div>"); 
     $("#Items").append(element); 
     element.hide().slideDown(500); 
    }); 
} 

function CopyItem(element) { 
    awaitingCopy = false; 
    var clone = element.clone(); 
    $("#Items").append(clone); 
    clone.hide().slideDown(500); 
} 

function StartDrag() { 
    $("#NewItem").hide(); 
    $("#CopyItem").show(); 
} 

function StopDrag(event, ui) { 
    if (awaitingCopy) { 
     $(this).sortable('cancel'); 
     CopyItem($(ui.item)); 
    } 
    $("#NewItem").show(); 
    $("#CopyItem").hide(); 
} 

W każdym razie, mam nadzieję, że to pomoże innym, którzy chcą tego samego rodzaju efekt ... nie kradną mój projekt chociaż;) Co

+3

Pomogło mi to znaleźć rozwiązanie, ale chciałbym zaznaczyć, że zmienna globalna była niepotrzebna - wygląda na to, że nie używasz właściwego selektora jQuery. Zamiast $ (this) .sportable ('cancel') ;, powinno być $ ("# Items"). Sortable ('cancel'); – NightOwl888

Powiązane problemy