From 87081b855c5ded96039d16791a30ff0181fb5a9f Mon Sep 17 00:00:00 2001 From: Will Holley Date: Tue, 21 May 2013 15:19:14 +0100 Subject: [PATCH] Droppable: only consider pointer location with tolerance "pointer" Fixes #4977 Closes gh-991 --- tests/unit/droppable/droppable_options.js | 15 ++++++++++++++- ui/droppable.js | 15 ++++++--------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/tests/unit/droppable/droppable_options.js b/tests/unit/droppable/droppable_options.js index 0971f1377..9bfa25881 100644 --- a/tests/unit/droppable/droppable_options.js +++ b/tests/unit/droppable/droppable_options.js @@ -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 + }); }); /* diff --git a/ui/droppable.js b/ui/droppable.js index 826f46e58..fce8d9bd9 100644 --- a/ui/droppable.js +++ b/ui/droppable.js @@ -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;