diff options
-rw-r--r-- | tests/unit/draggable/core.js | 30 | ||||
-rw-r--r-- | ui/widgets/draggable.js | 11 |
2 files changed, 35 insertions, 6 deletions
diff --git a/tests/unit/draggable/core.js b/tests/unit/draggable/core.js index 2ec102598..1dd6f572a 100644 --- a/tests/unit/draggable/core.js +++ b/tests/unit/draggable/core.js @@ -338,6 +338,36 @@ QUnit.test( "blur behavior - descendant of handle", function( assert ) { } ); } ); +QUnit.test( "blur behavior - off handle", function( assert ) { + var ready = assert.async(); + assert.expect( 3 ); + + var element = $( "#draggable2" ).draggable( { handle: "span" } ), + focusElement = $( "<div tabindex='1'></div>" ).appendTo( element ); + + // Mock $.ui.safeBlur with a spy + var _safeBlur = $.ui.safeBlur; + var blurCalledCount = 0; + $.ui.safeBlur = function() { + blurCalledCount++; + }; + + testHelper.onFocus( focusElement, function() { + assert.strictEqual( document.activeElement, focusElement.get( 0 ), "test element is focused before mousing down on a draggable" ); + + testHelper.move( element, 1, 1 ); + assert.strictEqual( blurCalledCount, 0, "draggable doesn't blur when mousing down off handle" ); + + testHelper.move( element.find( "span" ), 1, 1 ); + assert.strictEqual( blurCalledCount, 1, "draggable blurs when mousing down on handle" ); + + // Restore safeBlur + $.ui.safeBlur = _safeBlur; + + ready(); + } ); +} ); + QUnit.test( "ui-draggable-handle assigned to appropriate element", function( assert ) { assert.expect( 5 ); diff --git a/ui/widgets/draggable.js b/ui/widgets/draggable.js index 6b862d0d0..9e46c81bb 100644 --- a/ui/widgets/draggable.js +++ b/ui/widgets/draggable.js @@ -103,8 +103,6 @@ $.widget( "ui.draggable", $.ui.mouse, { _mouseCapture: function( event ) { var o = this.options; - this._blurActiveElement( event ); - // Among others, prevent a drag on a resizable-handle if ( this.helper || o.disabled || $( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) { @@ -117,6 +115,8 @@ $.widget( "ui.draggable", $.ui.mouse, { return false; } + this._blurActiveElement( event ); + this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix ); return true; @@ -147,11 +147,10 @@ $.widget( "ui.draggable", $.ui.mouse, { var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ), target = $( event.target ); - // Only blur if the event occurred on an element that is: - // 1) within the draggable handle - // 2) but not within the currently focused element + // Don't blur if the event occurred on an element that is within + // the currently focused element // See #10527, #12472 - if ( this._getHandle( event ) && target.closest( activeElement ).length ) { + if ( target.closest( activeElement ).length ) { return; } |