Drag & Drop: Drag Delegation with a Drop Target
This example shows how to create multiple draggable items efficiently, still allowing for Drop Targets.
- Item #1
- Item #2
- Item #3
- Item #4
- Item #5
- Item #6
- Item #7
- Item #8
- Item #9
- Item #10
Setting up the Delegate container and items
First we need to create an HTML Node to act as the delegate container and give it some nodes to make draggable.
<div id="play"> <div id="demo"> <ul> <li>Item #1</li> <li>Item #2</li> <li>Item #3</li> <li>Item #4</li> <li>Item #5</li> <li>Item #6</li> <li>Item #7</li> <li>Item #8</li> <li>Item #9</li> <li>Item #10</li> </ul> </div> <div id="drop">Drop on me</div> </div>
<div id="play"> <div id="demo"> <ul> <li>Item #1</li> <li>Item #2</li> <li>Item #3</li> <li>Item #4</li> <li>Item #5</li> <li>Item #6</li> <li>Item #7</li> <li>Item #8</li> <li>Item #9</li> <li>Item #10</li> </ul> </div> <div id="drop">Drop on me</div> </div>
Now we give them some CSS to make them visible.
#demo { width: 200px; } #demo ul li { border: 1px solid black; background-color: #8DD5E7; cursor: move; margin: 3px; list-style-type: none; }
#demo { width: 200px; } #demo ul li { border: 1px solid black; background-color: #8DD5E7; cursor: move; margin: 3px; list-style-type: none; }
Setting up the YUI Instance
Now we need to create our YUI instance and tell it to load the dd-delegate
module.
YUI().use('dd-delegate', 'dd-drop-plugin'
YUI().use('dd-delegate', 'dd-drop-plugin'
Making the Nodes draggable
Now that we have a YUI instance with the dd-delegate
module, we need to instantiate the Delegate
instance on this container and nodes.
YUI().use('dd-delegate', 'dd-drop-plugin', function(Y) { var del = new Y.DD.Delegate({ cont: '#demo', nodes: 'li' }); });
YUI().use('dd-delegate', 'dd-drop-plugin', function(Y) { var del = new Y.DD.Delegate({ cont: '#demo', nodes: 'li' }); });
Listening to some events
The Delegate
object is a bubble target for the DD.Drag
instances. So you can listen on it for all drag related events.
YUI().use('dd-delegate', 'dd-drop-plugin', function(Y) { var del = new Y.DD.Delegate({ cont: '#demo', nodes: 'li' }); del.on('drag:end', function(e) { del.get('currentNode').setStyles({ top: 0, left: 0 }); }); });
YUI().use('dd-delegate', 'dd-drop-plugin', function(Y) { var del = new Y.DD.Delegate({ cont: '#demo', nodes: 'li' }); del.on('drag:end', function(e) { del.get('currentNode').setStyles({ top: 0, left: 0 }); }); });
Adding a Drop Target
Now we can add a normal Drop Target to the page.
var drop = Y.one('#drop').plug(Y.Plugin.Drop);
var drop = Y.one('#drop').plug(Y.Plugin.Drop);
Once that is created, we can add a drop:hit
listener and manipulate the drag instance as we normally would.
var drop = Y.one('#drop').plug(Y.Plugin.Drop); drop.drop.on('drop:hit', function(e) { drop.set('innerHTML', 'You dropped: <strong>' + e.drag.get('node').get('innerHTML') + '</strong>'); });
var drop = Y.one('#drop').plug(Y.Plugin.Drop); drop.drop.on('drop:hit', function(e) { drop.set('innerHTML', 'You dropped: <strong>' + e.drag.get('node').get('innerHTML') + '</strong>'); });