diff options
author | Jörn Zaefferer <joern.zaefferer@gmail.com> | 2012-02-21 17:48:55 +0100 |
---|---|---|
committer | Jörn Zaefferer <joern.zaefferer@gmail.com> | 2012-02-21 17:48:55 +0100 |
commit | 6528b48b4762b0ddf3697580444fdf9f34e7eca9 (patch) | |
tree | 46e0e17d0b8356d0e9d142e9a00bdf242d5bbf2c /ui/jquery.ui.menu.js | |
parent | 98d72c7f6d0f1c535774d4db85556626e016603c (diff) | |
parent | d32a9e81ecb8a201c1737c3226a99c33ced451af (diff) | |
download | jquery-ui-6528b48b4762b0ddf3697580444fdf9f34e7eca9.tar.gz jquery-ui-6528b48b4762b0ddf3697580444fdf9f34e7eca9.zip |
Merge branch 'master' into selectmenu
Diffstat (limited to 'ui/jquery.ui.menu.js')
-rw-r--r-- | ui/jquery.ui.menu.js | 69 |
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() ); } }, |