From 8a0df90bf1650961952bdc251d19d29aeb0effeb Mon Sep 17 00:00:00 2001 From: Hans Hillen Date: Fri, 15 Apr 2011 19:18:58 +0200 Subject: Accessibility / bug fixes for menubar --- tests/visual/menu/menubar.js | 88 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 18 deletions(-) (limited to 'tests/visual/menu') diff --git a/tests/visual/menu/menubar.js b/tests/visual/menu/menubar.js index 6c8173cd9..7fb3aea36 100644 --- a/tests/visual/menu/menubar.js +++ b/tests/visual/menu/menubar.js @@ -13,20 +13,28 @@ $.widget("ui.menubar", { }, _create: function() { var self = this; - var items = this.items = this.element.children("button, a"); + var items = this.items = this.element.children("li") + .addClass("ui-menubar-item") + .attr("role", "presentation") + .children("button, a"); items.slice(1).attr("tabIndex", -1); 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').attr("role", "menubar"); this._focusable(items); this._hoverable(items); items.next("ul").each(function(i, elm) { $(elm).menu({ select: function(event, ui) { - ui.item.parents("ul:last").hide() - self.options.select.apply(this, arguments); + ui.item.parents("ul.ui-menu:last").hide(); + self._trigger( "select", event, ui ); + self._close(); + $(event.target).prev().focus(); } - }).hide().keydown(function(event) { + }).hide() + .attr("aria-hidden", "true") + .attr("aria-expanded", "false") + .keydown(function(event) { var menu = $(this); if (menu.is(":hidden")) return; @@ -40,9 +48,13 @@ $.widget("ui.menubar", { self._right(event); event.preventDefault(); break; + case $.ui.keyCode.TAB: + self.open= false; + break; }; }).blur(function( event ) { - self._close( event ); + if (!self.open) + self._close( event ); }); }); items.each(function() { @@ -60,7 +72,7 @@ $.widget("ui.menubar", { self._close(); return; } - if (self.open || event.type == "click") { + if ((self.open && event.type == "mouseenter") || event.type == "click") { self._open(event, menu); } }) @@ -83,6 +95,8 @@ $.widget("ui.menubar", { } }) .addClass("ui-button ui-widget ui-button-text-only ui-menubar-link") + .attr("role", "menuitem") + .attr("aria-haspopup", "true") .wrapInner(""); if (o.menuIcon) { @@ -108,15 +122,45 @@ $.widget("ui.menubar", { if (self.active.menu("left", event) !== true) { var active = self.active; self.active.blur(); + self._close( event ); active.prev().focus(); } } } }); }, + _destroy : function() { + var items = this.element.children("li") + .removeClass("ui-menubar-item") + .removeAttr("role", "presentation") + .children("button, a"); + + this.element.removeClass('ui-menubar ui-widget-header ui-helper-clearfix').removeAttr("role", "menubar").unbind(".menubar");; + items.unbind("focusin focusout click focus mouseenter keydown"); + + items + .removeClass("ui-button ui-widget ui-button-text-only ui-menubar-link") + .removeAttr("role", "menuitem") + .removeAttr("aria-haspopup", "true") + .children("span.ui-button-text").each(function(i, e) { + var item = $(this); + item.parent().html(item.html()); + }); + $(document).unbind(".menubar"); + + //TODO remove icons + + this.element.find(":ui-menu").menu("destroy") + .show() + .removeAttr("aria-hidden", "true") + .removeAttr("aria-expanded", "false") + .removeAttr("tabindex") + .unbind("keydown", "blur") + ; + }, _close: function() { - this.active.menu("closeAll").hide(); + this.active.menu("closeAll").hide().attr("aria-hidden", "true").attr("aria-expanded", "false"); this.active.prev().removeClass("ui-state-active").removeAttr("tabIndex"); this.active = null; var self = this; @@ -133,7 +177,7 @@ $.widget("ui.menubar", { } // almost the same as _close above, but don't remove tabIndex if (this.active) { - this.active.menu("closeAll").hide(); + this.active.menu("closeAll").hide().attr("aria-hidden", "true").attr("aria-expanded", "false"); this.active.prev().removeClass("ui-state-active"); } clearTimeout(this.timer); @@ -144,44 +188,52 @@ $.widget("ui.menubar", { my: "left top", at: "left bottom", of: button - }).focus(); + }) + .removeAttr("aria-hidden").attr("aria-expanded", "true") + .menu("focus", event, menu.children("li").first()) + .focus(); + }, _prev: function( event, button ) { button.attr("tabIndex", -1); - var prev = button.prevAll( ".ui-button" ).eq( 0 ); + var prev = button.parent().prevAll("li").children( ".ui-button" ).eq( 0 ); if (prev.length) { prev.removeAttr("tabIndex")[0].focus(); } else { - this.element.children(".ui-button:last").removeAttr("tabIndex")[0].focus(); + var lastItem = this.element.children("li:last").children(".ui-button:last"); + lastItem.removeAttr("tabIndex")[0].focus(); } }, _next: function( event, button ) { button.attr("tabIndex", -1); - var next = button.nextAll( ".ui-button" ).eq( 0 ); + var next = button.parent().nextAll("li").children( ".ui-button" ).eq( 0 ); if (next.length) { next.removeAttr("tabIndex")[0].focus(); } else { - this.element.children(".ui-button:first").removeAttr("tabIndex")[0].focus(); + var firstItem = this.element.children("li:first").children(".ui-button:first"); + firstItem.removeAttr("tabIndex")[0].focus(); } }, _left: function(event) { - var prev = this.active.prevAll( ".ui-menu" ).eq( 0 ); + var prev = this.active.parent().prevAll("li:eq(0)").children( ".ui-menu" ).eq( 0 ); if (prev.length) { this._open(event, prev); } else { - this._open(event, this.element.children(".ui-menu:last")); + var lastItem = this.element.children("li:last").children(".ui-menu:first"); + this._open(event, lastItem); } }, _right: function(event) { - var next = this.active.nextAll( ".ui-menu" ).eq( 0 ); + var next = this.active.parent().nextAll("li:eq(0)").children( ".ui-menu" ).eq( 0 ); if (next.length) { this._open(event, next); } else { - this._open(event, this.element.children(".ui-menu:first")); + var firstItem = this.element.children("li:first").children(".ui-menu:first"); + this._open(event, firstItem); } } }); -- cgit v1.2.3 From c6cbd8143b32e496c48bc4dfbae192db71bf9492 Mon Sep 17 00:00:00 2001 From: Hans Hillen Date: Fri, 15 Apr 2011 19:19:27 +0200 Subject: Updated menubar test to use UL elements rather than DIVs --- tests/visual/menu/menubar.html | 216 +++++++++++++++++++++++------------------ 1 file changed, 120 insertions(+), 96 deletions(-) (limited to 'tests/visual/menu') diff --git a/tests/visual/menu/menubar.html b/tests/visual/menu/menubar.html index 5847c623f..c5b63ae86 100644 --- a/tests/visual/menu/menubar.html +++ b/tests/visual/menu/menubar.html @@ -55,6 +55,16 @@ .ui-menubar .ui-button { float: left; font-weight: normal; border-top-width: 0 !important; border-bottom-width: 0 !important; margin: 0; outline: none; } .ui-menubar .ui-menubar-link { border-right: 1px dashed transparent; border-left: 1px dashed transparent; } + ol.ui-menubar, ul.ui-menubar { + list-style: none; + margin-left: 0; + padding-left: 0; + } + + li.ui-menubar-item { + float: left; + } + table { border-collapse: collapse; } @@ -66,85 +76,97 @@ - + - + @@ -161,24 +183,26 @@ -- cgit v1.2.3 From e448cd076153500f178878abfa7db7631d452ad8 Mon Sep 17 00:00:00 2001 From: Hans Hillen Date: Fri, 15 Apr 2011 20:31:43 +0200 Subject: Added icon removal to _destroy --- tests/visual/menu/menubar.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'tests/visual/menu') diff --git a/tests/visual/menu/menubar.js b/tests/visual/menu/menubar.js index 7fb3aea36..453f5fae7 100644 --- a/tests/visual/menu/menubar.js +++ b/tests/visual/menu/menubar.js @@ -129,6 +129,7 @@ $.widget("ui.menubar", { } }); }, + _destroy : function() { var items = this.element.children("li") .removeClass("ui-menubar-item") @@ -138,17 +139,18 @@ $.widget("ui.menubar", { this.element.removeClass('ui-menubar ui-widget-header ui-helper-clearfix').removeAttr("role", "menubar").unbind(".menubar");; items.unbind("focusin focusout click focus mouseenter keydown"); - items - .removeClass("ui-button ui-widget ui-button-text-only ui-menubar-link") + items + .removeClass("ui-button ui-widget ui-button-text-only ui-menubar-link ui-state-default") .removeAttr("role", "menuitem") .removeAttr("aria-haspopup", "true") .children("span.ui-button-text").each(function(i, e) { var item = $(this); item.parent().html(item.html()); - }); - $(document).unbind(".menubar"); + }) + .end() + .children(".ui-icon").remove(); - //TODO remove icons + $(document).unbind(".menubar"); this.element.find(":ui-menu").menu("destroy") .show() -- cgit v1.2.3 From 5076f233dbbfc39f29f2be11a9549f262bb471ea Mon Sep 17 00:00:00 2001 From: jzaefferer Date: Mon, 18 Apr 2011 17:07:08 +0200 Subject: Close popup when blurred and make sure that shift-tab when popup is open skips the trigger. --- tests/visual/menu/popup.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'tests/visual/menu') diff --git a/tests/visual/menu/popup.js b/tests/visual/menu/popup.js index 2cd4ee047..f57cba699 100644 --- a/tests/visual/menu/popup.js +++ b/tests/visual/menu/popup.js @@ -35,7 +35,7 @@ $.widget( "ui.popup", { this.element .addClass("ui-popup") this._close(); - + this._bind(this.options.trigger, { click: function( event ) { event.preventDefault(); @@ -46,6 +46,10 @@ $.widget( "ui.popup", { } }); + this._bind(this.element, { + blur: "_close" + }); + this._bind({ keyup: function( event ) { if (event.keyCode == $.ui.keyCode.ESCAPE && this.element.is( ":visible" )) { @@ -94,6 +98,10 @@ $.widget( "ui.popup", { .attr( "aria-expanded", true ) .position( position ) .focus(); + + // take trigger out of tab order to allow shift-tab to skip trigger + this.options.trigger.attr("tabindex", -1); + this.open = true; this._trigger( "open", event ); }, @@ -103,6 +111,9 @@ $.widget( "ui.popup", { .hide() .attr( "aria-hidden", true ) .attr( "aria-expanded", false ); + + this.options.trigger.attr("tabindex", 0); + this.open = false; this._trigger( "close", event ); } -- cgit v1.2.3 From d77185a5a115174cf6ab8bf5224f652124008e19 Mon Sep 17 00:00:00 2001 From: Hans Hillen Date: Mon, 18 Apr 2011 23:05:50 +0200 Subject: Fix "menubar does not collapse when clicking on other menubar" + minor changes --- tests/visual/menu/menubar.html | 4 ++-- tests/visual/menu/menubar.js | 10 +++++++--- ui/jquery.ui.menu.js | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) (limited to 'tests/visual/menu') diff --git a/tests/visual/menu/menubar.html b/tests/visual/menu/menubar.html index c5b63ae86..1b4b331f6 100644 --- a/tests/visual/menu/menubar.html +++ b/tests/visual/menu/menubar.html @@ -55,13 +55,13 @@ .ui-menubar .ui-button { float: left; font-weight: normal; border-top-width: 0 !important; border-bottom-width: 0 !important; margin: 0; outline: none; } .ui-menubar .ui-menubar-link { border-right: 1px dashed transparent; border-left: 1px dashed transparent; } - ol.ui-menubar, ul.ui-menubar { + .ui-menubar, .ui-menubar { list-style: none; margin-left: 0; padding-left: 0; } - li.ui-menubar-item { + .ui-menubar-item { float: left; } diff --git a/tests/visual/menu/menubar.js b/tests/visual/menu/menubar.js index 453f5fae7..e6f6ab069 100644 --- a/tests/visual/menu/menubar.js +++ b/tests/visual/menu/menubar.js @@ -67,7 +67,6 @@ $.widget("ui.menubar", { return; } event.preventDefault(); - event.stopPropagation(); if (event.type == "click" && menu.is(":visible") && self.active && self.active[0] == menu[0]) { self._close(); return; @@ -111,8 +110,11 @@ $.widget("ui.menubar", { }); self._bind(document, { click: function(event) { - if (self.open && !$(event.target).closest(".ui-menubar").length) { - self._close(); + if (self.open) { + var menubar = $(event.target).closest(".ui-menubar"); + if (!menubar.length || menubar.get(0) !== self.element.get(0)) { + self._close(); + } } } }) @@ -162,6 +164,8 @@ $.widget("ui.menubar", { }, _close: function() { + if (!this.active || !this.active.length) + return; this.active.menu("closeAll").hide().attr("aria-hidden", "true").attr("aria-expanded", "false"); this.active.prev().removeClass("ui-state-active").removeAttr("tabIndex"); this.active = null; diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index 0b2852f06..0a06fe0b5 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -319,6 +319,7 @@ $.widget("ui.menu", { if (newItem && newItem.length) { this._open(newItem.parent()); var current = this.active; + //timeout so Firefox will not hide activedescendant change in expanding submenu from AT setTimeout(function(){self.focus(event, newItem)}, 20); return true; } -- cgit v1.2.3 From 34e3a2401afc831ad084af1942670118a3ccabb1 Mon Sep 17 00:00:00 2001 From: jzaefferer Date: Wed, 20 Apr 2011 17:18:15 +0200 Subject: Menu: Add icons support --- tests/visual/menu/menu.html | 44 +++++++++++++++++++++++++++++++++++++++--- themes/base/jquery.ui.menu.css | 13 +++++++++++-- ui/jquery.ui.menu.js | 5 ++++- 3 files changed, 56 insertions(+), 6 deletions(-) (limited to 'tests/visual/menu') diff --git a/tests/visual/menu/menu.html b/tests/visual/menu/menu.html index cc1f4a939..1db12f25b 100644 --- a/tests/visual/menu/menu.html +++ b/tests/visual/menu/menu.html @@ -25,7 +25,7 @@ }); } - var menus = $("#menu1, #menu2, #menu3"); + var menus = $("#menu1, #menu2, #menu3, #menu4"); create(); $("#toggle-destroy").toggle(function() { @@ -41,7 +41,7 @@ @@ -56,7 +56,7 @@
  • Salzburg
  • -
    1993 3.6 - +