aboutsummaryrefslogtreecommitdiffstats
path: root/ui/jquery.ui.selectmenu.js
diff options
context:
space:
mode:
Diffstat (limited to 'ui/jquery.ui.selectmenu.js')
-rw-r--r--ui/jquery.ui.selectmenu.js54
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();
}
}
},