2012-03-21 14 views
12

Szukałem STACKOVERFLOW i innych forów dla rozwiązania mojego problemu - jeśli brakowało mi działającego rozwiązania, proszę wskazać mi kierunek.Jquery UI sortable - wykonuj akcję PRZED rozpoczęciem startu pożary

Mój problem: Zawsze, gdy przeciągam element (divlet portletu) na mojej liście do sortowania, muszę wykonać pewne działanie ZANIM rozpocznie się właściwy proces przeciągania (Z tego co rozumiem przed uruchomieniem zdarzenia START).

Aby być bardziej szczegółowym: Moje DIV-y dają użytkownikowi możliwość rozszerzenia/zwinięcia jego ciała (jak na przykład wygląda na stronie interfejsu JQuery http://jqueryui.com/demos/sortable/#portlets).

Podczas przeciągania elementu chciałbym wywołać moją metodę zwijania, tak aby jedynym elementem, który jest przeciągany, było zwinięte DIV.

Jednak gdy wzywam moja metoda (coś takiego)

$someitem.trigger("toggle.somenamespace") 

to działa zgodnie z oczekiwaniami, z tym że wysokość przeciągnięty pomocnik zostaje obliczona przed zdarzeniem start jest zwolniony w sortable i dlatego pomocnik ma wysokość oryginalnego elementu w stanie niezwiniętym.

Moja oryginalna myśl na ten temat brzmiała: jako że sortable ma np. możliwość pomiaru odległości przeciągania przed rozpoczęciem rzeczywistej procedury przeciągania (z opcją: odległość) powinno być możliwe przechwycenie tego przepływu, na przykład przechowywanie oryginalnej funkcji startDrag (lub jakkolwiek to się nazywa) sortable widget w tymczasowym var, nadpisaj go niestandardowym wywołaniem zwrotnym, które najpierw uruchamia moją funkcję zwijania, a następnie wywołuje oryginalną funkcję, aby upewnić się, że wysokość jest obliczana poprawnie. Jednak do tej pory nie miałem zbyt dużego sukcesu z tym podejściem ...

Należy pamiętać, że ustawienie właściwości CSS w modułach obsługi przeciągnięcia lub nad wydarzeniem sortable nie przynosi pożądanego efektu, ponieważ wysokość sortowalny widget obliczany dla helpera jest ustawiony jako właściwości elementu.

Lub - prawdopodobnie ktoś zna lepszy sposób wpływania na wysokość pomocnika wyświetlanego podczas przeciągania, to tylko moja opinia, że ​​moje oryginalne podejście (zmiana elementu przed procesem przeciągania, a następnie pozwolić widgetowi zrobić jego obliczenia tak było odnie) byłby lepszym rozwiązaniem ...

dzięki za wszelką pomoc, Matthias

EDIT: Ustawianie sortable flag forceHelperSize true i ustawiając ui.item/pomocnika rozmiar w początkowej draghandler nie działa, ponieważ powoduje wizualnie pożądany efekt (tylko zwinięty element jest przeciągany, ale zatrzymuje przeciąganie elementu do końca (tak, jakby element nadal miał wysokość w stanie niezwiniętym) testowany z pomocnikiem: "oryginał" i "klon"

Odpowiedz

13

Przeszukałem dawno do tego „rozwiązania”:

$('.handle').each(function() { 
    $(this).mousedown(function() { 
     $(this).parent().parent().children('ol').hide('blind', 500); 
    }); 
}); 

można wywołać zdarzenie mousedowning uchwyt i ukryć cokolwiek chcesz. Następnie ustaw opóźnienie opcji sortable na wartość większą niż czas trwania ukrytej animacji, w moim przykładzie 501.

To nie jest eleganckie rozwiązanie, ale działa - przynajmniej w moim programie.

+0

Zamiast robić każdy, byłoby lepiej, aby wybrać „.handle” w mousedown a następnie użyć $ (to) wewnątrz funkcji mousedown, która powinna odwoływać się do właściwego elementu? –

+0

Powinieneś również sprawdzić przesuwanie myszy. mousedown może oznaczać normalne kliknięcie. – Blaise

10

Można to zrobić, ale to nie jest przyszłościowe dla przyszłych wersjach jQuery UI:

var oldMouseStart = $.ui.sortable.prototype._mouseStart; 
$.ui.sortable.prototype._mouseStart = function(event, overrideHandle, noActivation) { 
    this._trigger("CustomBeforeStart", event, this._uiHash()); 
    oldMouseStart.apply(this, [event, overrideHandle, noActivation]); 
}; 

You can then use the new event when setting up the sortable: 

$(".whatever").sortable({ 
    "CustomBeforeStart":function(e, ui) { 
    } 
    ... 
}); 
Powiązane problemy