mirror of
https://github.com/jquery/jquery-ui.git
synced 2024-10-05 01:44:18 +00:00
Merge branch 'widget-delegation'
This commit is contained in:
commit
982b752c35
@ -666,6 +666,39 @@ test( "._bind() to descendent", function() {
|
||||
.trigger( "keydown" );
|
||||
});
|
||||
|
||||
test( "_bind() with delegate", function() {
|
||||
expect( 8 );
|
||||
$.widget( "ui.testWidget", {
|
||||
_create: function() {
|
||||
this.element = {
|
||||
bind: function( event, handler ) {
|
||||
equal( event, "click.testWidget" );
|
||||
ok( $.isFunction(handler) );
|
||||
},
|
||||
delegate: function( selector, event, handler ) {
|
||||
equal( selector, "a" );
|
||||
equal( event, "click.testWidget" );
|
||||
ok( $.isFunction(handler) );
|
||||
},
|
||||
trigger: $.noop
|
||||
};
|
||||
this._bind({
|
||||
"click": "handler",
|
||||
"click a": "handler",
|
||||
});
|
||||
this.element.delegate = function( selector, event, handler ) {
|
||||
equal( selector, "form fieldset > input" );
|
||||
equal( event, "change.testWidget" );
|
||||
ok( $.isFunction(handler) );
|
||||
};
|
||||
this._bind({
|
||||
"change form fieldset > input": "handler"
|
||||
});
|
||||
}
|
||||
});
|
||||
$.ui.testWidget();
|
||||
});
|
||||
|
||||
test( "._hoverable()", function() {
|
||||
$.widget( "ui.testWidget", {
|
||||
_create: function() {
|
||||
|
61
ui/jquery.ui.menu.js
vendored
61
ui/jquery.ui.menu.js
vendored
@ -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 );
|
||||
if ( !this.active || ( this.active[ 0 ] !== target[ 0 ] ) ) {
|
||||
this.focus( event, target );
|
||||
}
|
||||
self.select( event );
|
||||
})
|
||||
.bind( "mouseover.menu", function( event ) {
|
||||
if ( self.options.disabled ) {
|
||||
return;
|
||||
}
|
||||
var target = $( event.target ).closest( ".ui-menu-item" );
|
||||
if ( target.length ) {
|
||||
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" );
|
||||
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 );
|
||||
}
|
||||
})
|
||||
.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.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 ) {
|
||||
|
13
ui/jquery.ui.widget.js
vendored
13
ui/jquery.ui.widget.js
vendored
@ -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 );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user