]> source.dussan.org Git - jquery-ui.git/commitdiff
Draggable: Recalculate hash offset on start after plugins run
authorMike Sherov <mike.sherov@gmail.com>
Sun, 17 Aug 2014 01:27:16 +0000 (21:27 -0400)
committerMike Sherov <mike.sherov@gmail.com>
Sun, 17 Aug 2014 01:27:16 +0000 (21:27 -0400)
 Fixes #6884

tests/unit/draggable/draggable_events.js
ui/draggable.js

index bbaaaeb15a913242a27559b5136cff436921409f..dd5c315b0b46ec75e0ba1caf7cbb9420a39cc487 100644 (file)
@@ -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 = $( "<div style='margin: 2px;'></div>" ).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 );
index 6bd8ea1c18f645afd8a46450b3152f19a5c42f5b..3e427babecca798fe6fc7ae29f0a7885b40f87f6 100644 (file)
@@ -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 );
        },