mirror of
https://github.com/jquery/jquery-ui.git
synced 2024-11-21 11:04:24 +00:00
Menubar: Focus/tab handling, improved much
This commit is contained in:
parent
d4a81ec043
commit
133137b39b
@ -14,6 +14,7 @@ $.widget("ui.menubar", {
|
|||||||
_create: function() {
|
_create: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
var items = this.items = this.element.children("button, a");
|
var items = this.items = this.element.children("button, a");
|
||||||
|
items.slice(1).attr("tabIndex", -1);
|
||||||
var o = this.options;
|
var o = this.options;
|
||||||
|
|
||||||
this.element.addClass('ui-menubar ui-widget-header ui-helper-clearfix');
|
this.element.addClass('ui-menubar ui-widget-header ui-helper-clearfix');
|
||||||
@ -32,19 +33,16 @@ $.widget("ui.menubar", {
|
|||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
switch (event.keyCode) {
|
switch (event.keyCode) {
|
||||||
case $.ui.keyCode.LEFT:
|
case $.ui.keyCode.LEFT:
|
||||||
self.left(event);
|
self._left(event);
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
break;
|
break;
|
||||||
case $.ui.keyCode.RIGHT:
|
case $.ui.keyCode.RIGHT:
|
||||||
self.right(event);
|
self._right(event);
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
}).blur(function() {
|
}).blur(function() {
|
||||||
$(this).hide().prev().removeClass("ui-state-active").removeAttr("tabIndex");
|
self._close();
|
||||||
self.timer = setTimeout(function() {
|
|
||||||
self.open = false;
|
|
||||||
}, 13);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
items.each(function() {
|
items.each(function() {
|
||||||
@ -64,11 +62,20 @@ $.widget("ui.menubar", {
|
|||||||
})
|
})
|
||||||
.bind( "keydown", function( event ) {
|
.bind( "keydown", function( event ) {
|
||||||
switch ( event.keyCode ) {
|
switch ( event.keyCode ) {
|
||||||
|
case $.ui.keyCode.SPACE:
|
||||||
case $.ui.keyCode.UP:
|
case $.ui.keyCode.UP:
|
||||||
case $.ui.keyCode.DOWN:
|
case $.ui.keyCode.DOWN:
|
||||||
self._open( event, $( this ).next() );
|
self._open( event, $( this ).next() );
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
break;
|
break;
|
||||||
|
case $.ui.keyCode.LEFT:
|
||||||
|
self._prev( event, $( this ) );
|
||||||
|
event.preventDefault();
|
||||||
|
break;
|
||||||
|
case $.ui.keyCode.RIGHT:
|
||||||
|
self._next( event, $( this ) );
|
||||||
|
event.preventDefault();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.addClass("ui-button ui-widget ui-button-text-only ui-menubar-link")
|
.addClass("ui-button ui-widget ui-button-text-only ui-menubar-link")
|
||||||
@ -86,7 +93,7 @@ $.widget("ui.menubar", {
|
|||||||
});
|
});
|
||||||
self._bind(document, {
|
self._bind(document, {
|
||||||
click: function(event) {
|
click: function(event) {
|
||||||
!$(event.target).closest(".ui-menubar").length && self._close();
|
self.open && !$(event.target).closest(".ui-menubar").length && self._close();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
self._bind({
|
self._bind({
|
||||||
@ -103,12 +110,18 @@ $.widget("ui.menubar", {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_close: function() {
|
_close: function() {
|
||||||
this.items.next("ul").hide();
|
this.active.menu("closeAll").hide();
|
||||||
this.items.removeClass("ui-state-active").removeAttr("tabIndex");
|
this.active.prev().removeClass("ui-state-active").removeAttr("tabIndex");
|
||||||
this.open = false;
|
this.active = null;
|
||||||
|
var self = this;
|
||||||
|
// delay for the next focus event to see it as still "open"
|
||||||
|
self.timer = setTimeout(function() {
|
||||||
|
self.open = false;
|
||||||
|
}, 13);
|
||||||
},
|
},
|
||||||
|
|
||||||
_open: function(event, menu) {
|
_open: function(event, menu) {
|
||||||
|
// TODO refactor with _close
|
||||||
if (this.active) {
|
if (this.active) {
|
||||||
this.active.menu("closeAll").hide();
|
this.active.menu("closeAll").hide();
|
||||||
this.active.prev().removeClass("ui-state-active").removeAttr("tabIndex");
|
this.active.prev().removeClass("ui-state-active").removeAttr("tabIndex");
|
||||||
@ -124,7 +137,27 @@ $.widget("ui.menubar", {
|
|||||||
}).focus();
|
}).focus();
|
||||||
},
|
},
|
||||||
|
|
||||||
left: function(event) {
|
_prev: function( event, button ) {
|
||||||
|
button.attr("tabIndex", -1);
|
||||||
|
var prev = button.prevAll( ".ui-button" ).eq( 0 );
|
||||||
|
if (prev.length) {
|
||||||
|
prev.removeAttr("tabIndex")[0].focus();
|
||||||
|
} else {
|
||||||
|
this.element.children(".ui-button:last").removeAttr("tabIndex")[0].focus();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_next: function( event, button ) {
|
||||||
|
button.attr("tabIndex", -1);
|
||||||
|
var next = button.nextAll( ".ui-button" ).eq( 0 );
|
||||||
|
if (next.length) {
|
||||||
|
next.removeAttr("tabIndex")[0].focus();
|
||||||
|
} else {
|
||||||
|
this.element.children(".ui-button:first").removeAttr("tabIndex")[0].focus();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_left: function(event) {
|
||||||
var prev = this.active.prevAll( ".ui-menu" ).eq( 0 );
|
var prev = this.active.prevAll( ".ui-menu" ).eq( 0 );
|
||||||
if (prev.length) {
|
if (prev.length) {
|
||||||
this._open(event, prev);
|
this._open(event, prev);
|
||||||
@ -133,7 +166,7 @@ $.widget("ui.menubar", {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
right: function(event) {
|
_right: function(event) {
|
||||||
var next = this.active.nextAll( ".ui-menu" ).eq( 0 );
|
var next = this.active.nextAll( ".ui-menu" ).eq( 0 );
|
||||||
if (next.length) {
|
if (next.length) {
|
||||||
this._open(event, next);
|
this._open(event, next);
|
||||||
|
Loading…
Reference in New Issue
Block a user