Skip to content

Commit 87dc9ce

Browse files
committed
Menu: Prevent navigating to disabled menu items with the keyboard.
1 parent 30713ad commit 87dc9ce

File tree

2 files changed

+23
-23
lines changed

2 files changed

+23
-23
lines changed

tests/visual/menu/menu.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@
7474
</ul>
7575

7676
<ul id="menu2">
77-
<li><a href="#">Aberdeen</a></li>
77+
<li class="ui-state-disabled"><a href="#">Aberdeen</a></li>
7878
<li><a href="#">Ada</a></li>
79-
<li class="ui-state-disabled"><a href="#">Adamsville</a></li>
79+
<li><a href="#">Adamsville</a></li>
8080
<li><a href="#">Addyston</a></li>
8181
<li>
8282
<a href="#">Delphi</a>
@@ -109,6 +109,7 @@
109109
<li><a href="#">Perch</a></li>
110110
</ul>
111111
</li>
112+
<li class="ui-state-disabled"><a href="#">Amesville</a></li>
112113
</ul>
113114

114115
<ul id="menu3">

ui/jquery.ui.menu.js

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ $.widget( "ui.menu", {
7777
"mouseleave": "collapseAll",
7878
"mouseleave .ui-menu": "collapseAll",
7979
"focus": function( event ) {
80-
var firstItem = this.element.children( ".ui-menu-item" ).eq( 0 );
80+
var firstItem = this.element.children( ".ui-menu-item" ).not( ".ui-state-disabled" ).eq( 0 );
8181
if ( this._hasScroll() && !this.active ) {
8282
var menu = this.element;
8383
menu.children().each( function() {
@@ -417,7 +417,7 @@ $.widget( "ui.menu", {
417417
},
418418

419419
expand: function( event ) {
420-
var newItem = this.active && this.active.children( ".ui-menu " ).children( ".ui-menu-item" ).first();
420+
var newItem = this.active && this.active.children( ".ui-menu " ).children( ".ui-menu-item" ).not( ".ui-state-disabled" ).first();
421421

422422
if ( newItem && newItem.length ) {
423423
this._open( newItem.parent() );
@@ -447,28 +447,27 @@ $.widget( "ui.menu", {
447447
},
448448

449449
_move: function( direction, filter, event ) {
450-
if ( !this.active ) {
451-
this.focus( event, this.activeMenu.children( ".ui-menu-item" )[ filter ]() );
452-
return;
453-
}
454-
455450
var next;
456-
if ( direction === "first" || direction === "last" ) {
457-
next = this.active[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ).eq( -1 );
458-
} else {
459-
next = this.active[ direction + "All" ]( ".ui-menu-item" ).eq( 0 );
451+
if ( this.active ) {
452+
if ( direction === "first" || direction === "last" ) {
453+
next = this.active[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ).not( ".ui-state-disabled" ).eq( -1 );
454+
} else {
455+
next = this.active[ direction + "All" ]( ".ui-menu-item" ).not( ".ui-state-disabled" ).eq( 0 );
456+
}
457+
}
458+
if ( !next.length || !this.active ) {
459+
next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
460460
}
461461

462-
if ( next.length ) {
463-
this.focus( event, next );
464-
} else {
465-
this.focus( event, this.activeMenu.children( ".ui-menu-item" )[ filter ]() );
462+
this.focus( event, next );
463+
if ( next.is( ".ui-state-disabled" ) ) {
464+
this._move( direction, filter, event );
466465
}
467466
},
468467

469468
nextPage: function( event ) {
470469
if ( !this.active ) {
471-
this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
470+
this._move( "next", "first", event );
472471
return;
473472
}
474473
if ( this.isLastItem() ) {
@@ -478,21 +477,21 @@ $.widget( "ui.menu", {
478477
var base = this.active.offset().top,
479478
height = this.element.height(),
480479
result;
481-
this.active.nextAll( ".ui-menu-item" ).each( function() {
480+
this.active.nextAll( ".ui-menu-item" ).not( ".ui-state-disabled" ).each( function() {
482481
result = $( this );
483482
return $( this ).offset().top - base - height < 0;
484483
});
485484

486485
this.focus( event, result );
487486
} else {
488-
this.focus( event, this.activeMenu.children( ".ui-menu-item" )
487+
this.focus( event, this.activeMenu.children( ".ui-menu-item" ).not( ".ui-state-disabled" )
489488
[ !this.active ? "first" : "last" ]() );
490489
}
491490
},
492491

493492
previousPage: function( event ) {
494493
if ( !this.active ) {
495-
this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
494+
this._move( "next", "first", event );
496495
return;
497496
}
498497
if ( this.isFirstItem() ) {
@@ -502,14 +501,14 @@ $.widget( "ui.menu", {
502501
var base = this.active.offset().top,
503502
height = this.element.height(),
504503
result;
505-
this.active.prevAll( ".ui-menu-item" ).each( function() {
504+
this.active.prevAll( ".ui-menu-item" ).not( ".ui-state-disabled" ).each( function() {
506505
result = $( this );
507506
return $(this).offset().top - base + height > 0;
508507
});
509508

510509
this.focus( event, result );
511510
} else {
512-
this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
511+
this.focus( event, this.activeMenu.children( ".ui-menu-item" ).not( ".ui-state-disabled" ).first() );
513512
}
514513
},
515514

0 commit comments

Comments
 (0)