Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to start mouseover event while dragging

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?

like image 951
V.Rashkov Avatar asked Dec 23 '11 09:12

V.Rashkov


People also ask

What will happen if the mouse hovers over an element while dragging another element?

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).

How does mouseover event work?

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 .

Is mouseover the same as hover?

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.


1 Answers

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); 
like image 120
emrahgunduz Avatar answered Sep 22 '22 17:09

emrahgunduz