@@ -287,17 +287,24 @@ $.widget( "ui.selectmenu", {
287287 } ,
288288
289289 _move : function ( direction , event ) {
290+ var filter = ".ui-menu-item" ,
291+ item , next ;
292+
293+ if ( this . isOpen ) {
294+ item = this . menuItems . eq ( this . focusIndex ) ;
295+ } else {
296+ item = this . menuItems . eq ( this . element [ 0 ] . selectedIndex ) ;
297+ filter += ":not(.ui-state-disabled)" ;
298+ }
299+
290300 if ( direction === "first" || direction === "last" ) {
291- // Set focus manually for first or last item
292- this . menu . menu ( "focus" , event , this . menuItems [ direction ] ( ) ) ;
301+ next = item [ direction === "first" ? "prevAll" : "nextAll" ] ( filter ) . eq ( - 1 ) ;
293302 } else {
294- if ( direction === "previous" && this . menu . menu ( "isFirstItem" ) ||
295- direction === "next" && this . menu . menu ( "isLastItem" ) ) {
296- return ;
297- }
303+ next = item [ direction + "All" ] ( filter ) . eq ( 0 ) ;
304+ }
298305
299- // Move to and focus next or prev item
300- this . menu . menu ( direction , event ) ;
306+ if ( next . length ) {
307+ this . menu . menu ( "focus" , event , next ) ;
301308 }
302309 } ,
303310
@@ -340,14 +347,14 @@ $.widget( "ui.selectmenu", {
340347 break ;
341348 case $ . ui . keyCode . ENTER :
342349 if ( this . isOpen ) {
343- this . menuInstance . select ( event ) ;
350+ this . _selectMenu ( event ) ;
344351 }
345352 break ;
346353 case $ . ui . keyCode . UP :
347354 if ( event . altKey ) {
348355 this . _toggle ( event ) ;
349356 } else {
350- this . _move ( "previous " , event ) ;
357+ this . _move ( "prev " , event ) ;
351358 }
352359 break ;
353360 case $ . ui . keyCode . DOWN :
@@ -359,13 +366,13 @@ $.widget( "ui.selectmenu", {
359366 break ;
360367 case $ . ui . keyCode . SPACE :
361368 if ( this . isOpen ) {
362- this . menuInstance . select ( event ) ;
369+ this . _selectMenu ( event ) ;
363370 } else {
364371 this . _toggle ( event ) ;
365372 }
366373 break ;
367374 case $ . ui . keyCode . LEFT :
368- this . _move ( "previous " , event ) ;
375+ this . _move ( "prev " , event ) ;
369376 break ;
370377 case $ . ui . keyCode . RIGHT :
371378 this . _move ( "next" , event ) ;
@@ -389,6 +396,12 @@ $.widget( "ui.selectmenu", {
389396 }
390397 } ,
391398
399+ _selectMenu : function ( event ) {
400+ if ( ! this . menuItems . eq ( this . focusIndex ) . hasClass ( "ui-state-disabled" ) ) {
401+ this . menuInstance . select ( event ) ;
402+ }
403+ } ,
404+
392405 _select : function ( item , event ) {
393406 var oldIndex = this . element [ 0 ] . selectedIndex ;
394407
0 commit comments