YUI Library Home

YUI Library Examples: Drag & Drop: Using Interaction Groups

Drag & Drop: Using Interaction Groups

Using interaction groups, this example demonstrates how to tie into the Drag & Drop Utility's interesting moments to provide visual affordances for the current drag operation.

Interaction Mode:
1
2
3
4
5
6
1
2
3
4
5
6

Drag and Drop Interaction Groups and Affordances

The YUI Drag & Drop Utility lets you make HTML elements draggable.

All drag and drop instances are assigned to an interaction group. If a group is not specified in the constuctor, it is assigned to the default group. A given instance can belong to more than one group.

In this example, we have two interaction groups, topslots and bottomslots. The grey squares are the "slots", so #1 and #2 are the topslots and the others are the bottomslots. These are YAHOO.util.DDTarget instances, which means they can be targeted, but not dragged.

The colored "player" squares below are draggable. #1 and #2 are in the topslots group, #3 and #4 are in the bottomslots group, and #5 and #6 are assigned to both groups. When the drag starts, we use the highlight the slots that can be targeted by checking the group information.

Markup:

1<div class="slot" id="t1" >1</div> 
2<div class="slot" id="t2" >2</div> 
3<div class="slot" id="b1" >3</div> 
4<div class="slot" id="b2" >4</div> 
5<div class="slot" id="b3" >5</div> 
6<div class="slot" id="b4" >6</div> 
7 
8<div class="player" id="pt1" >1</div> 
9<div class="player" id="pt2" >2</div> 
10<div class="player" id="pb1" >3</div> 
11<div class="player" id="pb2" >4</div> 
12<div class="player" id="pboth1" >5</div> 
13<div class="player" id="pboth2" >6</div> 
view plain | print | ?

Code:

1<script type="text/javascript"
2 
3(function() { 
4 
5YAHOO.example.DDPlayer = function(id, sGroup, config) { 
6    YAHOO.example.DDPlayer.superclass.constructor.apply(this, arguments); 
7    this.initPlayer(id, sGroup, config); 
8}; 
9 
10YAHOO.extend(YAHOO.example.DDPlayer, YAHOO.util.DDProxy, { 
11 
12    TYPE: "DDPlayer"
13 
14    initPlayer: function(id, sGroup, config) { 
15        if (!id) {  
16            return;  
17        } 
18 
19        var el = this.getDragEl() 
20        YAHOO.util.Dom.setStyle(el, "borderColor""transparent"); 
21        YAHOO.util.Dom.setStyle(el, "opacity", 0.76); 
22 
23        // specify that this is not currently a drop target 
24        this.isTarget = false
25 
26        this.originalStyles = []; 
27 
28        this.type = YAHOO.example.DDPlayer.TYPE; 
29        this.slot = null
30 
31        this.startPos = YAHOO.util.Dom.getXY( this.getEl() ); 
32        YAHOO.log(id + " startpos: " + this.startPos, "info""example"); 
33    }, 
34 
35    startDrag: function(x, y) { 
36        YAHOO.log(this.id + " startDrag""info""example"); 
37        var Dom = YAHOO.util.Dom; 
38 
39        var dragEl = this.getDragEl(); 
40        var clickEl = this.getEl(); 
41 
42        dragEl.innerHTML = clickEl.innerHTML; 
43        dragEl.className = clickEl.className; 
44 
45        Dom.setStyle(dragEl, "color",  Dom.getStyle(clickEl, "color")); 
46        Dom.setStyle(dragEl, "backgroundColor", Dom.getStyle(clickEl, "backgroundColor")); 
47 
48        Dom.setStyle(clickEl, "opacity", 0.1); 
49 
50        var targets = YAHOO.util.DDM.getRelated(thistrue); 
51        YAHOO.log(targets.length + " targets""info""example"); 
52        for (var i=0; i<targets.length; i++) { 
53             
54            var targetEl = this.getTargetDomRef(targets[i]); 
55 
56            if (!this.originalStyles[targetEl.id]) { 
57                this.originalStyles[targetEl.id] = targetEl.className; 
58            } 
59 
60            targetEl.className = "target"
61        } 
62    }, 
63 
64    getTargetDomRef: function(oDD) { 
65        if (oDD.player) { 
66            return oDD.player.getEl(); 
67        } else { 
68            return oDD.getEl(); 
69        } 
70    }, 
71 
72    endDrag: function(e) { 
73        // reset the linked element styles 
74        YAHOO.util.Dom.setStyle(this.getEl(), "opacity", 1); 
75 
76        this.resetTargets(); 
77    }, 
78 
79    resetTargets: function() { 
80 
81        // reset the target styles 
82        var targets = YAHOO.util.DDM.getRelated(thistrue); 
83        for (var i=0; i<targets.length; i++) { 
84            var targetEl = this.getTargetDomRef(targets[i]); 
85            var oldStyle = this.originalStyles[targetEl.id]; 
86            if (oldStyle) { 
87                targetEl.className = oldStyle; 
88            } 
89        } 
90    }, 
91 
92    onDragDrop: function(e, id) { 
93        // get the drag and drop object that was targeted 
94        var oDD; 
95         
96        if ("string" == typeof id) { 
97            oDD = YAHOO.util.DDM.getDDById(id); 
98        } else { 
99            oDD = YAHOO.util.DDM.getBestMatch(id); 
100        } 
101 
102        var el = this.getEl(); 
103 
104        // check if the slot has a player in it already 
105        if (oDD.player) { 
106            // check if the dragged player was already in a slot 
107            if (this.slot) { 
108                // check to see if the player that is already in the 
109                // slot can go to the slot the dragged player is in 
110                // YAHOO.util.DDM.isLegalTarget is a new method 
111                if ( YAHOO.util.DDM.isLegalTarget(oDD.player, this.slot) ) { 
112                    YAHOO.log("swapping player positions""info""example"); 
113                    YAHOO.util.DDM.moveToEl(oDD.player.getEl(), el); 
114                    this.slot.player = oDD.player; 
115                    oDD.player.slot = this.slot; 
116                } else { 
117                    YAHOO.log("moving player in slot back to start""info""example"); 
118                    YAHOO.util.Dom.setXY(oDD.player.getEl(), oDD.player.startPos); 
119                    this.slot.player = null
120                    oDD.player.slot = null 
121                } 
122            } else { 
123                // the player in the slot will be moved to the dragged 
124                // players start position 
125                oDD.player.slot = null
126                YAHOO.util.DDM.moveToEl(oDD.player.getEl(), el); 
127            } 
128        } else { 
129            // Move the player into the emply slot 
130            // I may be moving off a slot so I need to clear the player ref 
131            if (this.slot) { 
132                this.slot.player = null
133            } 
134        } 
135 
136        YAHOO.util.DDM.moveToEl(el, oDD.getEl()); 
137        this.resetTargets(); 
138 
139        this.slot = oDD; 
140        this.slot.player = this
141    }, 
142 
143    swap: function(el1, el2) { 
144        var Dom = YAHOO.util.Dom; 
145        var pos1 = Dom.getXY(el1); 
146        var pos2 = Dom.getXY(el2); 
147        Dom.setXY(el1, pos2); 
148        Dom.setXY(el2, pos1); 
149    }, 
150 
151    onDragOver: function(e, id) { 
152    }, 
153 
154    onDrag: function(e, id) { 
155    } 
156 
157}); 
158 
159var slots = [], players = [], 
160    Event = YAHOO.util.Event, DDM = YAHOO.util.DDM; 
161 
162Event.onDOMReady(function() {  
163    // slots 
164    slots[0] = new YAHOO.util.DDTarget("t1""topslots"); 
165    slots[1] = new YAHOO.util.DDTarget("t2""topslots"); 
166    slots[2] = new YAHOO.util.DDTarget("b1""bottomslots"); 
167    slots[3] = new YAHOO.util.DDTarget("b2""bottomslots"); 
168    slots[4] = new YAHOO.util.DDTarget("b3""bottomslots"); 
169    slots[5] = new YAHOO.util.DDTarget("b4""bottomslots"); 
170     
171    // players 
172    players[0] = new YAHOO.example.DDPlayer("pt1""topslots"); 
173    players[1] = new YAHOO.example.DDPlayer("pt2""topslots"); 
174    players[2] = new YAHOO.example.DDPlayer("pb1""bottomslots"); 
175    players[3] = new YAHOO.example.DDPlayer("pb2""bottomslots"); 
176    players[4] = new YAHOO.example.DDPlayer("pboth1""topslots"); 
177    players[4].addToGroup("bottomslots"); 
178    players[5] = new YAHOO.example.DDPlayer("pboth2""topslots"); 
179    players[5].addToGroup("bottomslots"); 
180 
181    DDM.mode = document.getElementById("ddmode").selectedIndex; 
182 
183    Event.on("ddmode""change"function(e) { 
184            YAHOO.util.DDM.mode = this.selectedIndex; 
185        }); 
186}); 
187 
188})(); 
189</script> 
view plain | print | ?

Configuration for This Example

You can load the necessary JavaScript and CSS for this example from Yahoo's servers. Click here to load the YUI Dependency Configurator with all of this example's dependencies preconfigured.

Copyright © 2011 Yahoo! Inc. All rights reserved.

Privacy Policy - Terms of Service - Copyright Policy - Job Openings