@@ -177,23 +177,8 @@ $.widget("ui.draggable", $.ui.mouse, {
177
177
this . offsetParentCssPosition = this . offsetParent . css ( "position" ) ;
178
178
179
179
//The element's absolute position on the page minus margins
180
- this . offset = this . positionAbs = this . element . offset ( ) ;
181
- this . offset = {
182
- top : this . offset . top - this . margins . top ,
183
- left : this . offset . left - this . margins . left
184
- } ;
185
-
186
- //Reset scroll cache
187
- this . offset . scroll = false ;
188
-
189
- $ . extend ( this . offset , {
190
- click : { //Where the click happened, relative to the element
191
- left : event . pageX - this . offset . left ,
192
- top : event . pageY - this . offset . top
193
- } ,
194
- parent : this . _getParentOffset ( ) ,
195
- relative : this . _getRelativeOffset ( ) //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
196
- } ) ;
180
+ this . positionAbs = this . element . offset ( ) ;
181
+ this . _refreshOffsets ( event ) ;
197
182
198
183
//Generate the original position
199
184
this . originalPosition = this . position = this . _generatePosition ( event , false ) ;
@@ -234,6 +219,21 @@ $.widget("ui.draggable", $.ui.mouse, {
234
219
return true ;
235
220
} ,
236
221
222
+ _refreshOffsets : function ( event ) {
223
+ this . offset = {
224
+ top : this . positionAbs . top - this . margins . top ,
225
+ left : this . positionAbs . left - this . margins . left ,
226
+ scroll : false ,
227
+ parent : this . _getParentOffset ( ) ,
228
+ relative : this . _getRelativeOffset ( )
229
+ } ;
230
+
231
+ this . offset . click = {
232
+ left : event . pageX - this . offset . left ,
233
+ top : event . pageY - this . offset . top
234
+ } ;
235
+ } ,
236
+
237
237
_mouseDrag : function ( event , noPropagation ) {
238
238
// reset any necessary cached properties (see #5009)
239
239
if ( this . offsetParentCssPosition === "fixed" ) {
@@ -736,11 +736,13 @@ $.ui.plugin.add("draggable", "connectToSortable", {
736
736
737
737
this . instance . options . helper = this . instance . options . _helper ;
738
738
739
- //If the helper has been the original item, restore properties in the sortable
740
- if ( inst . options . helper === "original" ) {
741
- this . instance . currentItem . css ( { top : "auto" , left : "auto" } ) ;
742
- }
743
-
739
+ // restore properties in the sortable, since the draggable may have
740
+ // modified them in unexpected ways (#8809)
741
+ this . instance . currentItem . css ( {
742
+ position : this . instance . placeholder . css ( "position" ) ,
743
+ top : "" ,
744
+ left : ""
745
+ } ) ;
744
746
} else {
745
747
this . instance . cancelHelperRemoval = false ; //Remove the helper in the sortable instance
746
748
this . instance . _trigger ( "deactivate" , event , uiSortable ) ;
@@ -750,8 +752,6 @@ $.ui.plugin.add("draggable", "connectToSortable", {
750
752
751
753
} ,
752
754
drag : function ( event , ui , draggable ) {
753
- var dragElement = this ;
754
-
755
755
$ . each ( draggable . sortables , function ( ) {
756
756
var innermostIntersecting = false ,
757
757
thisSortable = this ,
@@ -787,9 +787,7 @@ $.ui.plugin.add("draggable", "connectToSortable", {
787
787
788
788
sortable . isOver = 1 ;
789
789
790
- sortable . currentItem = $ ( dragElement )
791
- . clone ( )
792
- . removeAttr ( "id" )
790
+ sortable . currentItem = ui . helper
793
791
. appendTo ( sortable . element )
794
792
. data ( "ui-sortable-item" , true ) ;
795
793
@@ -827,6 +825,10 @@ $.ui.plugin.add("draggable", "connectToSortable", {
827
825
828
826
if ( sortable . currentItem ) {
829
827
sortable . _mouseDrag ( event ) ;
828
+ // Copy the sortable's position because the draggable's can potentially reflect
829
+ // a relative position, while sortable is always absolute, which the dragged
830
+ // element has now become. (#8809)
831
+ ui . position = sortable . position ;
830
832
}
831
833
832
834
} else {
@@ -846,11 +848,15 @@ $.ui.plugin.add("draggable", "connectToSortable", {
846
848
sortable . _mouseStop ( event , true ) ;
847
849
sortable . options . helper = sortable . options . _helper ;
848
850
849
- sortable . currentItem . remove ( ) ;
850
851
if ( sortable . placeholder ) {
851
852
sortable . placeholder . remove ( ) ;
852
853
}
853
854
855
+ // Recalculate the draggable's offset considering the sortable
856
+ // may have modified them in unexpected ways (#8809)
857
+ draggable . _refreshOffsets ( event ) ;
858
+ ui . position = draggable . _generatePosition ( event , true ) ;
859
+
854
860
draggable . _trigger ( "fromSortable" , event ) ;
855
861
856
862
// draggable revert needs that
0 commit comments