2013-03-05 5 views
5

Sto utilizzando le funzioni della libreria JQuery UI droppable e desidero fornire un feedback visivo all'utente quando si posiziona su un target trascinabile. Per questo posso usare facilmente l'opzione hoverClass per specificare quale classe usare quando hanno un oggetto trascinabile al passaggio del mouse.Jquery UI Droppable: come posso utilizzare diversi valori hoverClass in base a qualche logica?

Ma quello che voglio fare è usare un diverso valore hoverClass a seconda della logica. Fondamentalmente, ci sono un certo numero di aree che sono "droppabili", e c'è una serie di elementi che possono essere trascinati e rilasciati - tuttavia, non tutti gli elementi possono essere rilasciati su tutte le aree. Quindi mi piacerebbe avere, ad esempio, uno sfondo verde se il drop è valido, e uno sfondo rosso se il drop non è valido.

Come si può fare? So quale logica voglio usare, ma dove posso aggiungere la logica. Ovviamente ha bisogno di essere da qualche parte in cui posso accedere all'elemento che viene trascinato e al potenziale elemento di destinazione di rilascio.

Il mio codice semplice finora è la seguente:

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

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

Questo non risponde direttamente alla tua domanda, ma suona bene per il vostro caso d'uso - Hai guardato utilizzando le opzioni/'' scope' accept' di assegnare certi draggables a determinati droppables? Quindi non avresti bisogno della logica per determinare hoverClass - sarebbe assegnato solo quando il draggable accetta il droppable. – freejosh

+0

@freejosh: Non penso che questo mi permetterebbe di specificare una classe per le gocce "non valide". Ora ho la mia risposta: D – musefan

risposta

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

Questo dovrebbe farlo. Su quell'evento verrà attivato su tutti gli elementi .DropItem. Potete trovare ulteriori informazioni sul eventi API disponibile qui: http://api.jqueryui.com/droppable/

+0

E come cambio 'hoverClass' in questo evento' over'? – musefan

+1

$ (questo) .addClass ('someClass'); basato sulla logica all'interno del listener di eventi. Ma assicurati di utilizzare l'attivazione o la disattivazione dei listener di eventi per reimpostare i nomi delle classi. – lucassp

+0

Quindi, vuoi dire, su "oltre" aggiungo io stesso la lezione. Quindi su "out" posso rimuovere la classe? OK, vedo, stai suggerendo che non mi preoccupo affatto di 'hoverClass'. Gli darei una prova e riferire indietro – musefan

2

Credo che il problema sta cercando di fare con la classe stessa, quando droppable ha il proprio evento hover, chiamato overjQuery droppable API #over

Quindi che ci si vuole :

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

Grazie, questo è ciò di cui avevo bisogno. Dovrai accontentarti solo dell'upvote anche se @lucassp sei stato tu a farlo: P – musefan

+0

Haha, lo so- lui con le dita più veloci! Grazie :) –

2

Le altre risposte sono esattamente ciò che stavo cercando. Tuttavia, voglio approfondire un po 'qui per dare un esempio migliore di come elaborare la logica.

Diciamo per esempio, con un semplice HTML come segue. Questo HTML ha fondamentalmente 4 oggetti trascinabili, e 4 possibili destinazioni di rilascio:

<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> 

Come si può vedere, ho usato data-* attributi per memorizzare i valori identificativi specifici. Gli ID su DragItem identificano l'oggetto drag e gli ID su DropItem contengono tutti i valori validi.

Il javascript che elabora questa logica, e quindi applica le classi corretta è la seguente:

$(".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"); 
    } 
}); 

Come si vede, sto facendo un semplice "non stringa contiene" controllo di logica. Questo va bene per i piccoli numeri, ma se c'è sempre bisogno di fare più di 9 oggetti avremmo bisogno di una stringa più affidabile nel valore DropItem data-id.

Uso anche gli eventi out e deactivate per svuotare le classi applicate. In questo esempio ho duplicato il codice, ma questo potrebbe essere facilmente sostituito con una singola funzione utilizzata da entrambi gli eventi.

Infine, nel momento in cui avete tutti aspettando, here is a working example.

Problemi correlati