Dialog: Focus tabbable only when dialog lost focus before.

This commit is contained in:
Jörn Zaefferer 2012-11-09 18:44:29 +01:00
parent 6edce86733
commit 0848040d3e
2 changed files with 60 additions and 8 deletions

View File

@ -39,6 +39,51 @@ test("open", function() {
el.remove(); el.remove();
}); });
test( "focus", function() {
expect( 5 );
var el, other;
el = $("#dialog1").dialog({
autoOpen: false
});
other = $("#dialog2").dialog({
autoOpen: false
});
el.one( "dialogopen", function() {
ok( true, "open, just once" );
});
el.one( "dialogfocus", function() {
ok( true, "focus on open" );
});
other.dialog( "open" );
el.one( "dialogfocus", function() {
ok( true, "when opening and already open and wasn't on top" );
});
other.dialog( "open" );
el.dialog( "open" );
el.one( "dialogfocus", function() {
ok( true, "when calling moveToTop and wasn't on top" );
});
other.dialog( "moveToTop" );
el.dialog( "moveToTop" );
el.bind( "dialogfocus", function() {
ok( true, "when mousedown anywhere on the dialog and it wasn't on top" );
});
other.dialog( "moveToTop" );
el.trigger( "mousedown" );
// triggers just once when already on top
el.dialog( "open" );
el.dialog( "moveToTop" );
el.trigger( "mousedown" );
el.add( other ).remove();
});
test("dragStart", function() { test("dragStart", function() {
expect(9); expect(9);

View File

@ -117,7 +117,9 @@ $.widget("ui.dialog", {
} }
}) })
.mousedown(function( event ) { .mousedown(function( event ) {
that.moveToTop( event ); if ( that._moveToTop( event ) ) {
that._focusTabbable();
}
}) })
.appendTo( this.document[ 0 ].body ); .appendTo( this.document[ 0 ].body );
@ -292,18 +294,23 @@ $.widget("ui.dialog", {
return this._isOpen; return this._isOpen;
}, },
moveToTop: function( event, silent ) { moveToTop: function() {
var moved = this.uiDialog.nextAll( ":visible" ).insertBefore( this.uiDialog ); this._moveToTop();
if ( !silent && moved.length ) { },
_moveToTop: function( event, silent ) {
var moved = !!this.uiDialog.nextAll( ":visible" ).insertBefore( this.uiDialog ).length;
if ( !silent && moved ) {
this._trigger( "focus", event ); this._trigger( "focus", event );
} }
return moved;
}, },
open: function() { open: function() {
if ( this._isOpen ) { if ( this._isOpen ) {
this.moveToTop( null ); if ( this._moveToTop() ) {
// TODO run this only when dialog wasn't focused?
this._focusTabbable(); this._focusTabbable();
}
return; return;
} }
@ -316,7 +323,7 @@ $.widget("ui.dialog", {
this._size(); this._size();
this._position( options.position ); this._position( options.position );
this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null; this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null;
this.moveToTop( null, true ); this._moveToTop( null, true );
this._show( uiDialog, options.show ); this._show( uiDialog, options.show );
this._focusTabbable(); this._focusTabbable();