2013-03-05 8 views
5

Używam funkcji bibliotecznych JQuery UI droppable i chcę zapewnić wizualną informację zwrotną od użytkownika po najechaniu kursorem nad zrzucanym celem. W tym celu mogę z łatwością użyć opcji hoverClass, aby określić klasę, która ma być używana, gdy element przeciągany jest najechany.Jquery UI Droppable: Jak mogę używać różnych wartości hoverClass na podstawie pewnej logiki?

Ale chcę użyć innej wartości hoverClass w zależności od logiki. Zasadniczo istnieje wiele obszarów, które można "zrzucić", i istnieje wiele przedmiotów, które można przeciągać i upuszczać - jednak nie wszystkie przedmioty można upuścić na wszystkich obszarach. Tak więc chciałbym mieć na przykład zielone tło, jeśli kropla jest ważna, i czerwone tło, jeśli kropla jest nieważna.

Jak można tego dokonać? Wiem, jakiej logiki chcę użyć, ale gdzie mogę dodać logikę. Oczywiście musi być gdzieś, gdzie mogę uzyskać dostęp do przeciąganego elementu i potencjalnego elementu docelowego upuszczania.

mój prosty kod do tej pory jest w następujący sposób:

$(".DragItem").draggable({ 
    revert: true, 
    helper: "clone" 
}); 

$(".DropItem").droppable({ 
    tolerance: "touch", 
    hoverClass: "DropTargetValid" 
}); 
+0

nie bezpośrednio odpowiedzieć na to pytanie, ale brzmi prawo dla przypadku użycia - nie spojrzał na użyciu 'scope' /' opcje accept' przypisać pewne draggables do niektórych droppables? Wtedy nie potrzebujesz logiki, aby określić hoverClass - zostanie ona przypisana tylko wtedy, gdy przeciągany zaakceptuje droppable. – freejosh

+0

@freejosh: Nie sądzę, że to pozwoliłoby mi określić klasę dla "nieważnych" kropli. Otrzymałem już teraz odpowiedź: D – musefan

Odpowiedz

3
$(".DropItem").droppable({ 
    tolerance: "touch", 
    hoverClass: "DropTargetValid", 
    over: function(event, ui) { 
     console.log(ui.draggable); // the draggable object 
     console.log($(this)); // the droppable object 
    } 
}); 

To powinno wystarczyć. Po przekroczeniu tego zdarzenia zostanie uruchomione na wszystkich elementach .DropItem. Możesz znaleźć więcej informacji na temat dostępnych wydarzeń API tutaj: http://api.jqueryui.com/droppable/

+0

A jak mogę zmienić 'hoverClass' w tym zdarzeniu' over'? – musefan

+1

$ (this) .addClass ("someClass"); w oparciu o logikę wewnątrz detektora zdarzeń. Ale upewnij się, że używasz aktywacji lub dezaktywacji detektorów zdarzeń, aby zresetować nazwy klas. – lucassp

+0

Masz na myśli, że na "over" dodaję samą klasę. Potem na "wyjściu" mogę usunąć zajęcia? OK, widzę, sugerujesz, że nie martwię się w ogóle o "hoverClass". Zrobię to i zgłoś się. – musefan

2

Myślę, że problemem jest stara się zrobić to z samej klasie, kiedy droppable posiada własne zdarzenia najechania, zwany overjQuery droppable API #over

Więc czego chcesz :

$(".DropItem").droppable({ 
    tolerance: "touch", 
    over: function(event, ui) { 
     // ... logic goes here 
    } 
}); 
+0

Dzięki, to jest to, czego potrzebowałem. Będziesz musiał zadowolić się tylko uprowadzeniem, ponieważ: @lucassp byłeś na to: P – musefan

+0

Haha, wiem - on z najszybszymi palcami! Dzięki :) –

2

Inne odpowiedzi są dokładnie tym, czego szukałem. Chciałbym jednak przedstawić nieco więcej szczegółów, aby dać lepszy przykład przetwarzania logiki.

Powiedzmy na przykład, że mamy prosty HTML w następujący sposób. To w zasadzie ma 4 HTML można przeciągać obiekty i 4 możliwe cele drop:

<div style="margin-bottom:20px;"> 
    <div data-id="1" class="DragItem">I am 1</div> 
    <div data-id="2" class="DragItem">I am 2</div> 
    <div data-id="3" class="DragItem">I am 3</div> 
    <div data-id="4" class="DragItem">I am 4</div> 
</div> 
<div> 
    <div data-id="123" class="DropItem">I accept 1, 2 and 3</div> 
    <div data-id="23" class="DropItem">I accept 2 and 3</div> 
    <div data-id="34" class="DropItem">I accept 3 and 4</div> 
    <div data-id="1234" class="DropItem">I accept all</div> 
</div> 

Jak widać, Użyłem data-* atrybutów do przechowywania określonych wartości identyfikujące. Identyfikatory DragItem identyfikują obiekt przeciągania, a identyfikatory DropItem zawierają wszystkie prawidłowe wartości.

javascript, który przetwarza tę logikę, a następnie stosuje się właściwe zajęcia się następująco:

$(".DragItem").draggable({ 
    revert: true, 
    helper: "clone" 
}); 

$(".DropItem").droppable({ 
    tolerance: "touch", 
    over: function (event, ui) { 
     var dropItem = $(this); 
     var dragItem = $(ui.draggable); 
     var valid = String(dropItem.data("id")).indexOf(dragItem.data("id")) > -1; 
     if (valid) { 
      dropItem.addClass("DropTargetValid"); 
     } else { 
      dropItem.addClass("DropTargetInvalid"); 
     } 
    }, 
    out: function (event, ui) { 
     var dropItem = $(this); 
     dropItem.removeClass("DropTargetValid"); 
     dropItem.removeClass("DropTargetInvalid"); 
    }, 
    deactivate: function (event, ui) { 
     var dropItem = $(this); 
     dropItem.removeClass("DropTargetValid"); 
     dropItem.removeClass("DropTargetInvalid"); 
    } 
}); 

Jak widać, robie proste „ma zawierać ciąg” check logiczny. Jest to dobre dla małych liczb, ale jeśli kiedykolwiek zajdzie potrzeba zrobienia więcej niż 9 obiektów, potrzebowalibyśmy bardziej niezawodnego ciągu w wartości DropItem data-id.

Używam również zdarzeń out i deactivate, aby wyczyścić zastosowane klasy. W tym przykładzie duplikuję kod, ale można go łatwo zastąpić jedną funkcją używaną przez oba zdarzenia.

Wreszcie, w chwili, gdy wszyscy czekali, here is a working example.

Powiązane problemy