Skip to content

Commit f3e4b24

Browse files
committed
Selectmenu: improve disabled item handling
1 parent 480e89b commit f3e4b24

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

tests/visual/selectmenu/selectmenu.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ <h2>Disabled tests</h2>
156156

157157
<label for="disabled2">Disabled options</label>
158158
<select name="disabled2" id="disabled2">
159-
<option value="1">1</option>
159+
<option value="1" disabled="disabled">1</option>
160160
<option value="2" selected="selected">2</option>
161161
<option value="3">3</option>
162162
<option disabled="disabled" value="4">4</option>

ui/jquery.ui.selectmenu.js

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)