#

Jump to Table of Contents

# Example: Using Drop Based Coding

This example shows how to use the Drop Target events to code your application.

Drag #1
Drag #2
Drag #3
Drag #4
Drag #5

### Setting up the HTML

First we need to create the HTML for the example.

    <div id="play">
        <div id="drag1" class="drag">Drag #1</div>
        <div id="drag2" class="drag">Drag #2</div>
        <div id="drag3" class="drag">Drag #3</div>
        <div id="drag4" class="drag">Drag #4</div>
        <div id="drag5" class="drag">Drag #5</div>
        <div id="drop"></div>
    </div>

Now we give the HTML some CSS to make them visible.

    .drag {
        height: 50px;
        width: 50px;
        border: 1px solid black;
        background-color: #004C6D;
        color: white;
        cursor: move;
        float: left;
        margin: 4px;
        z-index: 2;
    }
    #play {
        border: 1px solid black;
        height: 300px;
        position: relative;
    }
    #drop {
        position: absolute;
        bottom: 5px;
        right: 5px;
        border: 1px solid black;
        background-color: #8DD5E7;
        height: 75px;
        width: 65%;
        z-index: 1;
    }
    #drop p {
        margin: 1em;
    }
    #drop p strong {
        font-weight: bold;
    }
    #drop.yui3-dd-drop-over {
        background-color: #FFA928;
    }

### Setting up the YUI Instance

Now we need to create our YUI instance and tell it to load the `dd-drop` and `dd-constrain` modules.

    YUI().use('dd-drop', 'dd-constrain');

### Making the Nodes draggable

Now that we have a YUI instance with the `dd-drop` module, we need to instantiate the `Drag` instance on each Drag Node.

In this example we are using the data config option of the drag to associate data with this Drag instance.

So we have set up an object literal containing information about our drag items.

    var data = {
        'drag1': { color: 'white', size: 'x-small', price: '$5.00' },
        'drag2': { color: 'blue', size: 'small', price: '$6.00' },
        'drag3': { color: 'green', size: 'medium', price: '$7.00' },
        'drag4': { color: 'red', size: 'large', price: '$10.00' },
        'drag5': { color: 'purple', size: 'x-large', price: '$15.00' }
    };

Now we walk through the nodes and create a drag instance from each of them.

    YUI().use('dd-drop', 'dd-constrain', function(Y) {
        //Data to attach to each drag object
        var data = {
            'drag1': { color: 'white', size: 'x-small', price: '$5.00' },
            'drag2': { color: 'blue', size: 'small', price: '$6.00' },
            'drag3': { color: 'green', size: 'medium', price: '$7.00' },
            'drag4': { color: 'red', size: 'large', price: '$10.00' },
            'drag5': { color: 'purple', size: 'x-large', price: '$15.00' }
        };
        //Get all the divs with the class drag
        var drags = Y.Node.all('#play div.drag');
        //Walk through each one
        drags.each(function(v, k) {
            //scope a local var for the data
            var thisData = {};
            //Using Y.mix to break this data from the data above
            Y.mix(thisData, data[v.get('id')]);

            //Create the new Drag Instance
            var dd = new Y.DD.Drag({
                //Give it the node
                node: v,
                //Set the dragMode to intersect
                dragMode: 'intersect',
                //Attach the data here.
                data: thisData
            }).plug(Y.Plugin.DDConstrained, {
                //Keep it inside the work area
                constrain2node: '#play'
            });
            //Prevent the default end event (this moves the node back to its start position)
            dd.on('drag:end', function(e) {
                e.preventDefault();
            });
        });
    });

### Setting up the Drop Target

Here we set up the Drop Target and assign a listener to it.

    var drop = new Y.DD.Drop({
        node: '#drop'
    });
    //Listen for a drop:hit on this target
    drop.on('drop:hit', function(e) {
        //Now we get the drag instance that triggered the drop hit
        var drag = e.drag;
        //get the data from it
        var data = drag.get('data');

        //Do something with the data
        var out = ['id: ' + drag.get('node').get('id')];
        Y.each(data, function(v, k) {
            out[out.length] = k + ': ' + v;
        });
        var str = '<p><strong>Dropped</strong>: ' + out.join(', ') + '</p>';
        this.get('node').set('innerHTML', str);
    });

### Full Example Source

    YUI().use('dd-drop', 'dd-constrain', function(Y) {
            var data = {
                'drag1': { color: 'white', size: 'x-small', price: '$5.00' },
                'drag2': { color: 'blue', size: 'small', price: '$6.00' },
                'drag3': { color: 'green', size: 'medium', price: '$7.00' },
                'drag4': { color: 'red', size: 'large', price: '$10.00' },
                'drag5': { color: 'purple', size: 'x-large', price: '$15.00' }
            };
            var drags = Y.Node.all('#play div.drag');
            drags.each(function(v, k) {
                var thisData = {};
                Y.mix(thisData, data[v.get('id')]);
                var dd = new Y.DD.Drag({
                    node: v,
                    dragMode: 'intersect',
                    data: thisData
                }).plug(Y.Plugin.DDConstrained, {
                    constrain2node: '#play'
                });
                dd.on('drag:end', function(e) {
                    e.preventDefault();
                });
            });

            var drop = new Y.DD.Drop({
                node: '#drop'
            });
            drop.on('drop:hit', function(e) {
                var drag = e.drag;
                var data = drag.get('data');
                var out = ['id: ' + drag.get('node').get('id')];
                Y.each(data, function(v, k) {
                    out[out.length] = k + ': ' + v;
                });
                var str = '<p><strong>Dropped</strong>: ' + out.join(', ') + '</p>';
                this.get('node').set('innerHTML', str);
            });
    });