diff options
Diffstat (limited to 'ui/jquery.ui.selectmenu.js')
-rw-r--r-- | ui/jquery.ui.selectmenu.js | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js index b8aec3750..511760972 100644 --- a/ui/jquery.ui.selectmenu.js +++ b/ui/jquery.ui.selectmenu.js @@ -102,10 +102,8 @@ $.widget( "ui.selectmenu", { // create menu portion, append to body this.menu = $( '<ul />', { - 'class': 'ui-widget ui-widget-content', 'aria-hidden': true, 'aria-labelledby': this.ids.button, - role: 'menubox', id: this.ids.menu }); @@ -152,7 +150,9 @@ $.widget( "ui.selectmenu", { that.focus = item.index; } - }); + }) + // change ARIA role + .attr( 'role', 'menubox' ); // document click closes menu this._bind( document, { @@ -174,6 +174,7 @@ $.widget( "ui.selectmenu", { // adjust ARIA this.menu.find( "li" ).not( '.ui-selectmenu-optgroup' ).find( 'a' ).attr( 'role', 'option' ); + this.menu.attr( "aria-activedescendant" , this.menu.find( "li.ui-menu-item a" ).eq( this.element[0].selectedIndex ).attr( "id" ) ); if ( this.options.dropdown ) { this.menu @@ -209,10 +210,6 @@ $.widget( "ui.selectmenu", { }, 1); if ( !this.options.dropdown ) { - // center current item - if ( this.menu.css("overflow") == "auto" ) { - this.menu.scrollTop( this.menu.scrollTop() + currentItem.position().top - this.menu.outerHeight()/2 + currentItem.outerHeight()/2 ); - } // calculate offset var _offset = ( this.menu.offset().top - currentItem.offset().top + ( this.button.outerHeight() - currentItem.outerHeight() ) / 2); $.extend( this.options.position, { @@ -287,15 +284,22 @@ $.widget( "ui.selectmenu", { return li.appendTo( ul ); }, - _move: function( key, event ) { - if ( !this.isOpen ) { - this.menu.menu( "focus", event, this._getSelectedItem() ); + _move: function( direction, event ) { + if ( direction == "first" || direction == "last" ) { + // set focus manually for first or last item + this.menu.menu( "focus", event, this.menu.find( "li" ).not( '.ui-selectmenu-optgroup' )[ direction ]() ); + } else { + // if menu is closed we need to focus the element first to indicate correct element + if ( !this.isOpen ) { + this.menu.menu( "focus", event, this._getSelectedItem() ); + } + // move to and focus next or prev item + this.menu.menu( direction, event ); } - - this.menu.menu( key, event ); - + + // select if selectmenu is closed if ( !this.isOpen ) { - this.menu.menu( "select", event ); + this.menu.menu( "select", event ); } }, @@ -317,20 +321,20 @@ $.widget( "ui.selectmenu", { event.preventDefault(); }, keydown: function( event ) { + var prevDef = true; switch (event.keyCode) { case $.ui.keyCode.TAB: if ( this.isOpen ) { this.close( event ); } + prevDef = false; break; case $.ui.keyCode.ENTER: if ( this.isOpen ) { - this.menu.menu( "select", this._getSelectedItem() ); + this.menu.menu( "select", event ); } - event.preventDefault(); break; case $.ui.keyCode.SPACE: - event.preventDefault(); break; case $.ui.keyCode.UP: if ( event.altKey ) { @@ -338,7 +342,6 @@ $.widget( "ui.selectmenu", { } else { this._move( "previous", event ); } - event.preventDefault(); break; case $.ui.keyCode.DOWN: if ( event.altKey ) { @@ -346,18 +349,27 @@ $.widget( "ui.selectmenu", { } else { this._move( "next", event ); } - event.preventDefault(); break; case $.ui.keyCode.LEFT: this._move( "previous", event ); - event.preventDefault(); break; case $.ui.keyCode.RIGHT: this._move( "next", event ); - event.preventDefault(); + break; + case $.ui.keyCode.HOME: + case $.ui.keyCode.PAGE_UP: + this._move( "first", event ); + break; + case $.ui.keyCode.END: + case $.ui.keyCode.PAGE_DOWN: + this._move( "last", event ); break; default: this.menu.trigger( event ); + prevDef = false; + } + if ( prevDef ) { + event.preventDefault(); } } }, |