diff options
Diffstat (limited to 'ui')
-rw-r--r-- | ui/jquery.ui.menu.js | 67 | ||||
-rw-r--r-- | ui/jquery.ui.widget.js | 13 |
2 files changed, 37 insertions, 43 deletions
diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index c55ae75c9..27e76d909 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -38,52 +38,37 @@ $.widget( "ui.menu", { id: this.menuId, role: "menu" }) + // need to catch all clicks on disabled menu + // not possible through _bind .bind( "click.menu", function( event ) { - var item = $( event.target ).closest( ".ui-menu-item:has(a)" ); if ( self.options.disabled ) { - return false; - } - if ( !item.length ) { - return; + event.preventDefault(); } + }); + this._bind({ + "click .ui-menu-item:has(a)": function( event ) { + event.stopImmediatePropagation(); + var target = $( event.currentTarget ); // it's possible to click an item without hovering it (#7085) - if ( !self.active || ( self.active[ 0 ] !== item[ 0 ] ) ) { - self.focus( event, item ); - } - self.select( event ); - }) - .bind( "mouseover.menu", function( event ) { - if ( self.options.disabled ) { - return; - } - var target = $( event.target ).closest( ".ui-menu-item" ); - if ( target.length ) { - //Remove ui-state-active class from siblings of the newly focused menu item to avoid a jump caused by adjacent elements both having a class with a border - target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" ); - self.focus( event, target ); - } - }) - .bind( "mouseout.menu", function( event ) { - if ( self.options.disabled ) { - return; - } - var target = $( event.target ).closest( ".ui-menu-item" ); - if ( target.length ) { - self.blur( event ); + if ( !this.active || ( this.active[ 0 ] !== target[ 0 ] ) ) { + this.focus( event, target ); } - }) - .bind( "focus.menu", function( event ) { - if ( self.options.disabled ) { - return; - } - self.focus( event, $( event.target ).children( ".ui-menu-item:first" ) ); - }) - .bind( "blur.menu", function( event ) { - if ( self.options.disabled ) { - return; - } - self.collapseAll( event ); - }); + this.select( event ); + }, + "mouseover .ui-menu-item": function( event ) { + event.stopImmediatePropagation(); + var target = $( event.currentTarget ); + // Remove ui-state-active class from siblings of the newly focused menu item to avoid a jump caused by adjacent elements both having a class with a border + target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" ); + this.focus( event, target ); + }, + "mouseout .ui-menu-item": "blur", + "focus": function( event ) { + this.focus( event, $( event.target ).children( ".ui-menu-item:first" ) ); + }, + "blur": "collapseAll" + }); + this.refresh(); this.element.attr( "tabIndex", 0 ).bind( "keydown.menu", function( event ) { diff --git a/ui/jquery.ui.widget.js b/ui/jquery.ui.widget.js index 59d110b6a..a66b8a54a 100644 --- a/ui/jquery.ui.widget.js +++ b/ui/jquery.ui.widget.js @@ -305,9 +305,10 @@ $.Widget.prototype = { element = $( element ); this.bindings = this.bindings.add( element ); } + var instance = this; $.each( handlers, function( event, handler ) { - element.bind( event + "." + instance.widgetName, function() { + function handlerProxy() { // allow widgets to customize the disabled handling // - disabled as an array instead of boolean // - disabled class as method for disabling individual parts @@ -317,7 +318,15 @@ $.Widget.prototype = { } return ( typeof handler === "string" ? instance[ handler ] : handler ) .apply( instance, arguments ); - }); + } + var match = event.match( /^(\w+)\s*(.*)$/ ), + eventName = match[1] + "." + instance.widgetName, + selector = match[2]; + if ( selector ) { + element.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } }); }, |