Skip to content

Commit 451dded

Browse files
committed
Draggable: Ensure helper is positioned even if its the element itself
Fixes #9446
1 parent 8eca7b8 commit 451dded

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

tests/unit/draggable/draggable_options.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,25 @@ test( "helper, default, switching after initialization", function() {
701701
TestHelpers.draggable.shouldMove( element, "helper: original" );
702702
});
703703

704+
// http://bugs.jqueryui.com/ticket/9446
705+
// Draggable: helper function cannot emulate default behavior
706+
test( "helper, function returning original element", function() {
707+
expect( 1 );
708+
709+
var element = $( "#draggable1" ).css( "position", "static" ).draggable({
710+
helper: function() {
711+
return this;
712+
}
713+
});
714+
715+
TestHelpers.draggable.testDragHelperOffset( element, 100, 100, 100, 100, "original element is draggable" );
716+
717+
element.simulate( "drag", {
718+
dx: 100,
719+
dy: 100
720+
});
721+
});
722+
704723
function testHelperPosition( scrollPositions, position, helper, scrollElements, scrollElementsTitle ) {
705724
test( "{ helper: '" + helper + "' }, " + position + ", with scroll offset on " + scrollElementsTitle, function() {
706725
expect( scrollPositions.length * 2 );

ui/draggable.js

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ $.widget("ui.draggable", $.ui.mouse, {
6161
},
6262
_create: function() {
6363

64-
if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) {
65-
this.element[0].style.position = "relative";
64+
if ( this.options.helper === "original" ) {
65+
this._setPositionRelative();
6666
}
6767
if (this.options.addClasses){
6868
this.element.addClass("ui-draggable");
@@ -345,12 +345,24 @@ $.widget("ui.draggable", $.ui.mouse, {
345345
_createHelper: function(event) {
346346

347347
var o = this.options,
348-
helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[ 0 ], [ event ])) : (o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element);
348+
helperIsFunction = $.isFunction( o.helper ),
349+
helper = helperIsFunction ?
350+
$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
351+
( o.helper === "clone" ?
352+
this.element.clone().removeAttr( "id" ) :
353+
this.element );
349354

350355
if (!helper.parents("body").length) {
351356
helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
352357
}
353358

359+
// http://bugs.jqueryui.com/ticket/9446
360+
// a helper function can return the original element
361+
// which wouldn't have been set to relative in _create
362+
if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
363+
this._setPositionRelative();
364+
}
365+
354366
if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
355367
helper.css("position", "absolute");
356368
}
@@ -359,6 +371,12 @@ $.widget("ui.draggable", $.ui.mouse, {
359371

360372
},
361373

374+
_setPositionRelative: function() {
375+
if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
376+
this.element[ 0 ].style.position = "relative";
377+
}
378+
},
379+
362380
_adjustOffsetFromHelper: function(obj) {
363381
if (typeof obj === "string") {
364382
obj = obj.split(" ");

0 commit comments

Comments
 (0)