aboutsummaryrefslogtreecommitdiffstats
path: root/ui/jquery.ui.menu.js
diff options
context:
space:
mode:
Diffstat (limited to 'ui/jquery.ui.menu.js')
-rw-r--r--ui/jquery.ui.menu.js69
1 files changed, 37 insertions, 32 deletions
diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js
index 83ea3c3c0..42829c2a1 100644
--- a/ui/jquery.ui.menu.js
+++ b/ui/jquery.ui.menu.js
@@ -45,6 +45,9 @@ $.widget( "ui.menu", {
event.preventDefault();
}
}, this));
+ if ( this.options.disabled ) {
+ this.element.addClass( "ui-state-disabled" );
+ }
this._bind({
// Prevent focus from sticking to links inside menu after clicking
// them (focus should always stay on UL during navigation).
@@ -53,13 +56,16 @@ $.widget( "ui.menu", {
},
"click .ui-menu-item:has(a)": function( event ) {
event.stopImmediatePropagation();
- this.select( event );
- // Redirect focus to the menu with a delay for firefox
- this._delay( function() {
- if ( !this.element.is(":focus") ) {
- this.element.focus();
- }
- }, 20);
+ //Don't select disabled menu items
+ if ( !$( event.target ).closest( ".ui-menu-item" ).is( ".ui-state-disabled" ) ) {
+ this.select( event );
+ // Redirect focus to the menu with a delay for firefox
+ this._delay( function() {
+ if ( !this.element.is(":focus") ) {
+ this.element.focus();
+ }
+ }, 20);
+ }
},
"mouseover .ui-menu-item": function( event ) {
event.stopImmediatePropagation();
@@ -71,7 +77,7 @@ $.widget( "ui.menu", {
"mouseleave": "collapseAll",
"mouseleave .ui-menu": "collapseAll",
"focus": function( event ) {
- var firstItem = this.element.children( ".ui-menu-item" ).eq( 0 );
+ var firstItem = this.element.children( ".ui-menu-item" ).not( ".ui-state-disabled" ).eq( 0 );
if ( this._hasScroll() && !this.active ) {
var menu = this.element;
menu.children().each( function() {
@@ -280,8 +286,8 @@ $.widget( "ui.menu", {
this.blur( event );
if ( this._hasScroll() ) {
- var borderTop = parseFloat( $.curCSS( this.activeMenu[0], "borderTopWidth", true ) ) || 0,
- paddingTop = parseFloat( $.curCSS( this.activeMenu[0], "paddingTop", true ) ) || 0,
+ var borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0,
+ paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0,
offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop,
scroll = this.activeMenu.scrollTop(),
elementHeight = this.activeMenu.height(),
@@ -411,7 +417,7 @@ $.widget( "ui.menu", {
},
expand: function( event ) {
- var newItem = this.active && this.active.children( ".ui-menu " ).children( ".ui-menu-item" ).first();
+ var newItem = this.active && this.active.children( ".ui-menu " ).children( ".ui-menu-item" ).not( ".ui-state-disabled" ).first();
if ( newItem && newItem.length ) {
this._open( newItem.parent() );
@@ -424,11 +430,11 @@ $.widget( "ui.menu", {
}
},
- next: function(event) {
+ next: function( event ) {
this._move( "next", "first", event );
},
- previous: function(event) {
+ previous: function( event ) {
this._move( "prev", "last", event );
},
@@ -441,28 +447,27 @@ $.widget( "ui.menu", {
},
_move: function( direction, filter, event ) {
- if ( !this.active ) {
- this.focus( event, this.activeMenu.children( ".ui-menu-item" )[ filter ]() );
- return;
- }
-
var next;
- if ( direction === "first" || direction === "last" ) {
- next = this.active[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ).eq( -1 );
- } else {
- next = this.active[ direction + "All" ]( ".ui-menu-item" ).eq( 0 );
+ if ( this.active ) {
+ if ( direction === "first" || direction === "last" ) {
+ next = this.active[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ).not( ".ui-state-disabled" ).eq( -1 );
+ } else {
+ next = this.active[ direction + "All" ]( ".ui-menu-item" ).not( ".ui-state-disabled" ).eq( 0 );
+ }
+ }
+ if ( !next || !next.length || !this.active ) {
+ next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
}
- if ( next.length ) {
- this.focus( event, next );
- } else {
- this.focus( event, this.activeMenu.children( ".ui-menu-item" )[ filter ]() );
+ this.focus( event, next );
+ if ( next.is( ".ui-state-disabled" ) ) {
+ this._move( direction, filter, event );
}
},
nextPage: function( event ) {
if ( !this.active ) {
- this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
+ this._move( "next", "first", event );
return;
}
if ( this.isLastItem() ) {
@@ -472,21 +477,21 @@ $.widget( "ui.menu", {
var base = this.active.offset().top,
height = this.element.height(),
result;
- this.active.nextAll( ".ui-menu-item" ).each( function() {
+ this.active.nextAll( ".ui-menu-item" ).not( ".ui-state-disabled" ).each( function() {
result = $( this );
return $( this ).offset().top - base - height < 0;
});
this.focus( event, result );
} else {
- this.focus( event, this.activeMenu.children( ".ui-menu-item" )
+ this.focus( event, this.activeMenu.children( ".ui-menu-item" ).not( ".ui-state-disabled" )
[ !this.active ? "first" : "last" ]() );
}
},
previousPage: function( event ) {
if ( !this.active ) {
- this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
+ this._move( "next", "first", event );
return;
}
if ( this.isFirstItem() ) {
@@ -496,14 +501,14 @@ $.widget( "ui.menu", {
var base = this.active.offset().top,
height = this.element.height(),
result;
- this.active.prevAll( ".ui-menu-item" ).each( function() {
+ this.active.prevAll( ".ui-menu-item" ).not( ".ui-state-disabled" ).each( function() {
result = $( this );
return $(this).offset().top - base + height > 0;
});
this.focus( event, result );
} else {
- this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
+ this.focus( event, this.activeMenu.children( ".ui-menu-item" ).not( ".ui-state-disabled" ).first() );
}
},