]> source.dussan.org Git - jquery-ui.git/commitdiff
Droppable: only consider pointer location with tolerance "pointer"
authorWill Holley <willholley@gmail.com>
Tue, 21 May 2013 14:19:14 +0000 (15:19 +0100)
committerMike Sherov <mike.sherov@gmail.com>
Mon, 11 Aug 2014 01:00:33 +0000 (21:00 -0400)
Fixes #4977
Closes gh-991

tests/unit/droppable/droppable_options.js
ui/droppable.js

index 0971f1377ab51d932abc9bfa82c5c28d084af0a1..9bfa258814f0ccbd238b22a9a52c8cc03e4d29d8 100644 (file)
@@ -96,7 +96,7 @@ test( "tolerance, intersect", function() {
 */
 
 test( "tolerance, pointer", function() {
-       expect( 2 );
+       expect( 3 );
 
        var draggable, droppable,
                dataset = [
@@ -132,6 +132,19 @@ test( "tolerance, pointer", function() {
                        dy: ( data[ 1 ] - $( draggable ).position().top )
                });
        });
+
+       // http://bugs.jqueryui.com/ticket/4977 - tolerance, pointer - bug when pointer outside draggable
+       draggable.css({ top: 0, left: 0 }).draggable( "option", "axis", "x" );
+       droppable.css({ top: 15, left: 15 });
+
+       droppable.unbind( "drop" ).bind( "drop", function() {
+               ok( true, "drop fires as long as pointer is within droppable" );
+       });
+
+       $( draggable ).simulate( "drag", {
+               dx: 10,
+               dy: 10
+       });
 });
 
 /*
index 826f46e586c56b13cfed8fa8897b1a840982d2ca..fce8d9bd9b27f5570d984cf2f9110f0cad31f5fe 100644 (file)
@@ -191,7 +191,7 @@ $.widget( "ui.droppable", {
                                !inst.options.disabled &&
                                inst.options.scope === draggable.options.scope &&
                                inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&
-                               $.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance )
+                               $.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )
                        ) { childrenIntersection = true; return false; }
                });
                if ( childrenIntersection ) {
@@ -229,14 +229,13 @@ $.ui.intersect = (function() {
                return ( x >= reference ) && ( x < ( reference + size ) );
        }
 
-       return function( draggable, droppable, toleranceMode ) {
+       return function( draggable, droppable, toleranceMode, event ) {
 
                if ( !droppable.offset ) {
                        return false;
                }
 
-               var draggableLeft, draggableTop,
-                       x1 = ( draggable.positionAbs || draggable.position.absolute ).left,
+               var x1 = ( draggable.positionAbs || draggable.position.absolute ).left,
                        y1 = ( draggable.positionAbs || draggable.position.absolute ).top,
                        x2 = x1 + draggable.helperProportions.width,
                        y2 = y1 + draggable.helperProportions.height,
@@ -254,9 +253,7 @@ $.ui.intersect = (function() {
                                t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
                                y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
                case "pointer":
-                       draggableLeft = ( ( draggable.positionAbs || draggable.position.absolute ).left + ( draggable.clickOffset || draggable.offset.click ).left );
-                       draggableTop = ( ( draggable.positionAbs || draggable.position.absolute ).top + ( draggable.clickOffset || draggable.offset.click ).top );
-                       return isOverAxis( draggableTop, t, droppable.proportions().height ) && isOverAxis( draggableLeft, l, droppable.proportions().width );
+                       return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );
                case "touch":
                        return (
                                ( y1 >= t && y1 <= b ) || // Top edge touching
@@ -326,7 +323,7 @@ $.ui.ddmanager = {
                        if ( !this.options ) {
                                return;
                        }
-                       if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance ) ) {
+                       if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
                                dropped = this._drop.call( this, event ) || dropped;
                        }
 
@@ -363,7 +360,7 @@ $.ui.ddmanager = {
                        }
 
                        var parentInstance, scope, parent,
-                               intersects = $.ui.intersect( draggable, this, this.options.tolerance ),
+                               intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
                                c = !intersects && this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null );
                        if ( !c ) {
                                return;