When I drag an element over another div
on which I have a mouseover event, the event doesn't trigger. However, it works if I hover over it without dragging.
Is there a way to detect hover events on an element if I drag another one over it?
If you mouseover an element which is covered by another element, the mouseover event doesn't fire (unless the covering element is a child of the element, in which case it bubbles).
The mouseover event occurs when a mouse pointer comes over an element, and mouseout – when it leaves. These events are special, because they have property relatedTarget . This property complements target . When a mouse leaves one element for another, one of them becomes target , and the other one – relatedTarget .
1. Alternatively referred to as mouseover or mouse hover, hover describes the act of moving a mouse pointer over a clickable object, but not actually clicking the left or right mouse button.
Here is an example using the X-Y coordinate solution.
Working example on jsfiddle
The example can be improved, but is a good starting point.
Simply keeps track of the mouse location and checks if it appears to be inside any bounding boxes of the droppable objects. Hence, if the mouseup event fires on any one of them, dragged object is dropped.
You can also use the coordinates of the object you are dragging for detecting if its on a droppable box, but it requires a little more code for finding the bounding box coords and using the mouse is enough for me.
The code uses jQuery but no jQueryUI. I tested in Chrome, Firefox and Opera, but not IE :)
I'm also adding the code to here if jsfiddle is not accessible.
HTML
<p>Drag orange boxes to grey ones</p> <div class="droppable"></div> <div class="droppable"></div> <div class="droppable"></div> <div class="droppable"></div> <div class="draggable"></div> <div class="draggable"></div> <div class="draggable"></div>
CSS
.droppable { width:50px; height:50px; float: left; background-color: #DDD; margin: 5px; } .draggable { width:40px; height:40px; float: right; background-color: #FC0; margin: 5px; cursor: pointer; } .dropped { background-color: #FC0; } .somethingover { background-color: #FCD; }
JS
var dragged, mousex, mousey, coordinates = []; var continueDragging = function(e) { // Change the location of the draggable object dragged.css({ "left": e.pageX - (dragged.width() / 2), "top": e.pageY - (dragged.height() / 2) }); // Check if we hit any boxes for (var i in coordinates) { if (mousex >= coordinates[i].left && mousex <= coordinates[i].right) { if (mousey >= coordinates[i].top && mousey <= coordinates[i].bottom) { // Yes, the mouse is on a droppable area // Lets change the background color coordinates[i].dom.addClass("somethingover"); } } else { // Nope, we did not hit any objects yet coordinates[i].dom.removeClass("somethingover"); } } // Keep the last positions of the mouse coord.s mousex = e.pageX; mousey = e.pageY; } var endDragging = function(e) { // Remove document event listeners $(document).unbind("mousemove", continueDragging); $(document).unbind("mouseup", endDragging); // Check if we hit any boxes for (var i in coordinates) { if (mousex >= coordinates[i].left && mousex <= coordinates[i].right) { if (mousey >= coordinates[i].top && mousey <= coordinates[i].bottom) { // Yes, the mouse is on a droppable area droptarget = coordinates[i].dom; droptarget.removeClass("somethingover").addClass("dropped"); dragged.hide("fast", function() { $(this).remove(); }); } } } // Reset variables mousex = 0; mousey = 0; dragged = null; coordinates = []; } var startDragging = function(e) { // Find coordinates of the droppable bounding boxes $(".droppable").each(function() { var lefttop = $(this).offset(); // and save them in a container for later access coordinates.push({ dom: $(this), left: lefttop.left, top: lefttop.top, right: lefttop.left + $(this).width(), bottom: lefttop.top + $(this).height() }); }); // When the mouse down event is received if (e.type == "mousedown") { dragged = $(this); // Change the position of the draggable dragged.css({ "left": e.pageX - (dragged.width() / 2), "top": e.pageY - (dragged.height() / 2), "position": "absolute" }); // Bind the events for dragging and stopping $(document).bind("mousemove", continueDragging); $(document).bind("mouseup", endDragging); } } // Start the dragging $(".draggable").bind("mousedown", startDragging);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With