From b5846bece34db31d69e75cb3a3537827c005910e Mon Sep 17 00:00:00 2001 From: Mike Sherov Date: Sat, 16 Aug 2014 21:27:16 -0400 Subject: [PATCH] Draggable: Recalculate hash offset on start after plugins run Fixes #6884 --- tests/unit/draggable/draggable_events.js | 39 ++++++++++++++++++++++++ ui/draggable.js | 5 +-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/tests/unit/draggable/draggable_events.js b/tests/unit/draggable/draggable_events.js index bbaaaeb15..dd5c315b0 100644 --- a/tests/unit/draggable/draggable_events.js +++ b/tests/unit/draggable/draggable_events.js @@ -118,8 +118,47 @@ test( "stopping the stop callback", function() { }); ok( element.draggable( "instance" ).helper, "the clone should not be deleted if the stop callback is stopped" ); +}); +// http://bugs.jqueryui.com/ticket/6884 +// Draggable: ui.offset.left differs between the "start" and "drag" hooks +test( "position and offset in hash is consistent between start, drag, and stop", function() { + expect( 4 ); + var startPos, startOffset, dragPos, dragOffset, stopPos, stopOffset; + + element = $( "
" ).appendTo( "#qunit-fixture" ); + + element.draggable({ + start: function( event, ui ) { + startPos = ui.position; + startOffset = ui.offset; + }, + drag: function( event, ui ) { + dragPos = ui.position; + dragOffset = ui.offset; + }, + stop: function( event, ui ) { + stopPos = ui.position; + stopOffset = ui.offset; + } + }); + + element.simulate( "drag", { + dx: 10, + dy: 10, + moves: 1 + }); + + startPos.left += 10; + startPos.top += 10; + startOffset.left += 10; + startOffset.top += 10; + + deepEqual( startPos, dragPos, "start position equals drag position plus distance" ); + deepEqual( dragPos, stopPos, "drag position equals stop position" ); + deepEqual( startOffset, dragOffset, "start offset equals drag offset plus distance" ); + deepEqual( dragOffset, stopOffset, "drag offset equals stop offset" ); }); })( jQuery ); diff --git a/ui/draggable.js b/ui/draggable.js index 6bd8ea1c1..3e427babe 100644 --- a/ui/draggable.js +++ b/ui/draggable.js @@ -614,9 +614,10 @@ $.widget("ui.draggable", $.ui.mouse, { ui = ui || this._uiHash(); $.ui.plugin.call( this, type, [ event, ui, this ], true ); - // The absolute position has to be recalculated after plugins - if ( type === "drag" ) { + // Absolute position and offset (see #6884 ) have to be recalculated after plugins + if ( /^(drag|start|stop)/.test( type ) ) { this.positionAbs = this._convertPositionTo( "absolute" ); + ui.offset = this.positionAbs; } return $.Widget.prototype._trigger.call( this, type, event, ui ); },