Shantanu Tomar
Shantanu Tomar

Reputation: 1712

Jquery Drag and Drop

I have picked up this code(DragandDrop.jsp) from this page ::

http://jsfiddle.net/petersendidit/S4QgX/

I am getting the page like that only.But items are not draggable and i can't drop them to a particular shopping cart. Seems to me that i have to write an onload() j query function in order to accomplish that for my code in tags, but i don't know how to that. Or may be there's another error. I have put css code in the page only rather importing it as an external file. please help me out with the code. Thanks for the help.

DragandDrop.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<style type="text/css">
h1 { padding: .2em; margin: 0; }
#products { float:left; width:200px; height: 600px; margin-right: 20px; }
#products ul {list-style: disc; padding: 1em 0 1em 3em;}
.shoppingCart{ width: 200px; margin: 20px; float: left; }
/* style the list to maximize the droppable hitarea */
.shoppingCart ol { margin: 0; padding: 1em 0 1em 3em; list-style-type: decimal;  }
</style>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript">

$("#products li").draggable({
    appendTo: "body",
    helper: "clone"
});
$(".shoppingCart ol").droppable({
    activeClass: "ui-state-default",
    hoverClass: "ui-state-hover",
    drop: function(event, ui) {
        var self = $(this);
        self.find(".placeholder").remove();
        var productid = ui.draggable.attr("data-id");
        if (self.find("[data-id=" + productid + "]").length) return;
        $("<li></li>", {
            "text": ui.draggable.text(),
            "data-id": productid
        }).appendTo(this);
        // To remove item from other shopping chart do this
        var cartid = self.closest('.shoppingCart').attr('id');
        $(".shoppingCart:not(#"+cartid+") [data-id="+productid+"]").remove();
    }
}).sortable({
    items: "li:not(.placeholder)",
    sort: function() {
        $(this).removeClass("ui-state-default");
    }
});
</script>
</head>
<body>
<div id="products">
    <h1 class="ui-widget-header">Product list</h1>
    <div class="ui-widget-content">
        <ul>
            <li data-id="1"> product 1 </li>
            <li data-id="2"> product 2 </li>
            <li data-id="3"> product 3 </li>
            <li data-id="4"> product 4 </li>
            <li data-id="5"> product 5 </li>
        </ul>
    </div>
</div>

<div id="shoppingCart1" class="shoppingCart">
    <h1 class="ui-widget-header">Shopping Cart 1</h1>
    <div class="ui-widget-content">
        <ol>
            <li class="placeholder">Add your items here</li>
        </ol>
    </div>
</div>
<div id="shoppingCart2" class="shoppingCart">
    <h1 class="ui-widget-header">Shopping Cart 2</h1>
    <div class="ui-widget-content">
        <ol>
            <li class="placeholder">Add your items here</li>
        </ol>
    </div>
</div>
</body>
</html>

Upvotes: 0

Views: 739

Answers (1)

Marek Karbarz
Marek Karbarz

Reputation: 29324

Put your javascript code in $(document).ready block. As it is now, when your javascript code executes none of the elements are rendered on the page yet, so jQuery has nothing to bind to. $(document).ready will execute only after the page has rendered so your products and shopping cart will be available to jQuery to make them draggable/droppable.

<script type="text/javascript">
$(document).ready(function() {
    $("#products li").draggable({
        appendTo: "body",
        helper: "clone"
    });
    $(".shoppingCart ol").droppable({
        activeClass: "ui-state-default",
        hoverClass: "ui-state-hover",
        drop: function(event, ui) {
            var self = $(this);
            self.find(".placeholder").remove();
            var productid = ui.draggable.attr("data-id");
            if (self.find("[data-id=" + productid + "]").length) return;
            $("<li></li>", {
                "text": ui.draggable.text(),
                "data-id": productid
            }).appendTo(this);
            // To remove item from other shopping chart do this
            var cartid = self.closest('.shoppingCart').attr('id');
            $(".shoppingCart:not(#"+cartid+") [data-id="+productid+"]").remove();
        }
    }).sortable({
        items: "li:not(.placeholder)",
        sort: function() {
            $(this).removeClass("ui-state-default");
        }
    });
});
</script>

Upvotes: 1

Related Questions