|
35 | 35 | mobileMenu = 'slicknav', |
36 | 36 | prefix = 'slicknav'; |
37 | 37 |
|
| 38 | + Keyboard = { |
| 39 | + DOWN: 40, |
| 40 | + ENTER: 13, |
| 41 | + ESCAPE: 27, |
| 42 | + LEFT: 37, |
| 43 | + RIGHT: 39, |
| 44 | + SPACE: 32, |
| 45 | + TAB: 9, |
| 46 | + UP: 38, |
| 47 | + }; |
| 48 | + |
38 | 49 | function Plugin(element, options) { |
39 | 50 | this.element = element; |
40 | 51 |
|
|
112 | 123 | $(menuBar).append(brand); |
113 | 124 | } |
114 | 125 | $this.btn = $( |
115 | | - ['<' + settings.parentTag + ' aria-haspopup="true" tabindex="0" class="' + prefix + '_btn ' + prefix + '_collapsed">', |
| 126 | + ['<' + settings.parentTag + ' aria-haspopup="true" role="button" tabindex="0" class="' + prefix + '_btn ' + prefix + '_collapsed">', |
116 | 127 | '<span class="' + prefix + '_menutxt">' + settings.label + '</span>', |
117 | 128 | '<span class="' + iconClass + '">', |
118 | 129 | '<span class="' + prefix + '_icon-bar"></span>', |
|
251 | 262 | $this._itemClick($(this)); |
252 | 263 | }); |
253 | 264 |
|
254 | | - // check for enter key on menu button and menu parents |
| 265 | + // check for keyboard events on menu button and menu parents |
255 | 266 | $($this.btn).keydown(function (e) { |
256 | 267 | var ev = e || event; |
257 | | - if(ev.keyCode == 13) { |
258 | | - e.preventDefault(); |
259 | | - $this._menuToggle(); |
| 268 | + |
| 269 | + switch(ev.keyCode) { |
| 270 | + case Keyboard.ENTER: |
| 271 | + case Keyboard.SPACE: |
| 272 | + case Keyboard.DOWN: |
| 273 | + e.preventDefault(); |
| 274 | + if (ev.keyCode !== Keyboard.DOWN || !$($this.btn).hasClass(prefix+'_open')){ |
| 275 | + $this._menuToggle(); |
| 276 | + } |
| 277 | + |
| 278 | + $($this.btn).next().find('[role="menuitem"]').first().focus(); |
| 279 | + break; |
260 | 280 | } |
| 281 | + |
| 282 | + |
261 | 283 | }); |
262 | 284 |
|
263 | 285 | $this.mobileNav.on('keydown', '.'+prefix+'_item', function(e) { |
264 | 286 | var ev = e || event; |
265 | | - if(ev.keyCode == 13) { |
266 | | - e.preventDefault(); |
267 | | - $this._itemClick($(e.target)); |
| 287 | + |
| 288 | + switch(ev.keyCode) { |
| 289 | + case Keyboard.ENTER: |
| 290 | + e.preventDefault(); |
| 291 | + $this._itemClick($(e.target)); |
| 292 | + break; |
| 293 | + case Keyboard.RIGHT: |
| 294 | + e.preventDefault(); |
| 295 | + if ($(e.target).parent().hasClass(prefix+'_collapsed')) { |
| 296 | + $this._itemClick($(e.target)); |
| 297 | + } |
| 298 | + $(e.target).next().find('[role="menuitem"]').first().focus(); |
| 299 | + break; |
| 300 | + } |
| 301 | + }); |
| 302 | + |
| 303 | + $this.mobileNav.on('keydown', '[role="menuitem"]', function(e) { |
| 304 | + var ev = e || event; |
| 305 | + |
| 306 | + switch(ev.keyCode){ |
| 307 | + case Keyboard.DOWN: |
| 308 | + e.preventDefault(); |
| 309 | + var allItems = $(e.target).parent().parent().children().children('[role="menuitem"]:visible'); |
| 310 | + var idx = allItems.index( e.target ); |
| 311 | + var nextIdx = idx + 1; |
| 312 | + if (allItems.length <= nextIdx) { |
| 313 | + nextIdx = 0; |
| 314 | + } |
| 315 | + var next = allItems.eq( nextIdx ); |
| 316 | + next.focus(); |
| 317 | + break; |
| 318 | + case Keyboard.UP: |
| 319 | + e.preventDefault(); |
| 320 | + var allItems = $(e.target).parent().parent().children().children('[role="menuitem"]:visible'); |
| 321 | + var idx = allItems.index( e.target ); |
| 322 | + var next = allItems.eq( idx - 1 ); |
| 323 | + next.focus(); |
| 324 | + break; |
| 325 | + case Keyboard.LEFT: |
| 326 | + e.preventDefault(); |
| 327 | + if ($(e.target).parent().parent().parent().hasClass(prefix+'_open')) { |
| 328 | + var parent = $(e.target).parent().parent().prev(); |
| 329 | + parent.focus(); |
| 330 | + $this._itemClick(parent); |
| 331 | + } else if ($(e.target).parent().parent().hasClass(prefix+'_nav')){ |
| 332 | + $this._menuToggle(); |
| 333 | + $($this.btn).focus(); |
| 334 | + } |
| 335 | + break; |
| 336 | + case Keyboard.ESCAPE: |
| 337 | + e.preventDefault(); |
| 338 | + $this._menuToggle(); |
| 339 | + $($this.btn).focus(); |
| 340 | + break; |
268 | 341 | } |
269 | 342 | }); |
270 | 343 |
|
|
0 commit comments