@@ -62,14 +62,9 @@ Ext.extend(MODx.Layout, Ext.Viewport, {
6262 , splitBarMargin : 8
6363
6464 /**
65- * @property {Array } focusRestoreEls - Set Focus back on the last Element in array on close
65+ * @property {Object } focusRestoreEl - Set Focus back on this Element
6666 */
67- , focusRestoreEls : [ ]
68-
69- /**
70- * @property {bool } subNavOpen - Check if Subnav is opened
71- */
72- , subNavOpen : false
67+ , focusRestoreEl : [ ]
7368
7469 /**
7570 * @property {Function } getSplitBarMargin - Utility getter for splitBarMargin
@@ -493,9 +488,9 @@ Ext.extend(MODx.Layout, Ext.Viewport, {
493488 }
494489 }
495490 } ) ;
496- buttons [ i ] . addEventListener ( 'click' , function ( e ) {
491+ buttons [ i ] . addEventListener ( 'click' , function ( e ) {
497492 e . stopPropagation ( ) ;
498- el . focusRestoreEls . push ( this . querySelectorAll ( 'a' ) [ 0 ] ) ;
493+ el . focusRestoreEl = this . querySelectorAll ( 'a' ) [ 0 ] ;
499494 el . showMenu ( this ) ;
500495 } ) ;
501496 }
@@ -514,30 +509,38 @@ Ext.extend(MODx.Layout, Ext.Viewport, {
514509 submenu . classList . remove ( 'active' ) ;
515510 } else {
516511 this . hideMenu ( ) ;
512+ var isClick = false ;
517513 submenu . classList . add ( 'active' ) ;
518514 setTimeout ( ( ) => {
519- submenu . querySelectorAll ( 'a' ) [ 0 ] . focus ( ) ;
515+ var firstFocusEl = submenu . querySelectorAll ( 'a' ) [ 0 ] ;
516+ if ( ! firstFocusEl ) {
517+ return ;
518+ }
519+ firstFocusEl . focus ( ) ;
520520 } , 50 ) ;
521+ var menuItemClicked = ( e ) => {
522+ isClick = true ;
523+ window . removeEventListener ( 'click' , menuItemClicked ) ;
524+ } ;
521525 var focusRestore = ( e ) => {
522- setTimeout ( ( ) => {
523- if ( this . subNavOpen ) {
524- return ;
525- }
526+ requestAnimationFrame ( ( ) => {
526527 if ( ! submenu . contains ( document . activeElement ) ) {
527- this . focusRestoreEls ?. pop ( ) ?. focus ( ) ;
528+ if ( ! isClick ) {
529+ this . focusRestoreEl ?. focus ( ) ;
530+ }
528531 this . hideMenu ( ) ;
529532 window . removeEventListener ( 'focusout' , focusRestore ) ;
530533 }
531- } , 1 ) ;
534+ } ) ;
532535 } ;
533536 var menuArrowKeysNavigation = ( e ) => {
534537 if ( e . code == 'Escape' ) {
535538 this . hideMenu ( ) ;
536- this . focusRestoreEls [ 0 ] ?. focus ( ) ;
537- this . focusRestoreEls = [ ] ;
539+ this . focusRestoreEl ?. focus ( ) ;
538540 window . removeEventListener ( 'keyup' , menuArrowKeysNavigation ) ;
539541 }
540542 } ;
543+ window . addEventListener ( 'click' , menuItemClicked ) ;
541544 window . addEventListener ( 'focusout' , focusRestore ) ;
542545 window . addEventListener ( 'keyup' , menuArrowKeysNavigation ) ;
543546 }
@@ -552,7 +555,6 @@ Ext.extend(MODx.Layout, Ext.Viewport, {
552555 , initSubPopper : function ( ) {
553556 var buttons = document . querySelectorAll ( '#modx-header .sub, #modx-footer .sub' ) ;
554557 var position = window . innerWidth <= 960 ? 'bottom' : 'right' ;
555- var _this = this ;
556558 for ( var i = 0 ; i < buttons . length ; i ++ ) {
557559 let popperInstance = null ;
558560
@@ -595,17 +597,14 @@ Ext.extend(MODx.Layout, Ext.Viewport, {
595597 }
596598
597599 function show ( button ) {
598- var menu = button . getElementsByTagName ( 'ul' ) [ 0 ] ;
600+ var submenu = button . getElementsByTagName ( 'ul' ) [ 0 ] ;
599601 button . classList . add ( 'active' ) ;
600- menu . classList . add ( 'active' ) ;
601- _this . focusRestoreEls . push ( button . querySelectorAll ( 'a' ) [ 0 ] ) ;
602- _this . subNavOpen = true ;
603- create ( button , menu ) ;
602+ submenu . classList . add ( 'active' ) ;
603+ create ( button , submenu ) ;
604604 var focusRestore = ( e ) => {
605605 requestAnimationFrame ( ( ) => {
606- if ( ! menu . contains ( document . activeElement ) ) {
607- _this . focusRestoreEls ?. pop ( ) ?. parentNode ?. nextSibling ?. focus ( ) ;
608- hide ( button ) ;
606+ if ( ! submenu . contains ( document . activeElement ) ) {
607+ submenu . classList . remove ( 'active' ) ;
609608 window . removeEventListener ( 'focusout' , focusRestore ) ;
610609 }
611610 } ) ;
@@ -623,7 +622,6 @@ Ext.extend(MODx.Layout, Ext.Viewport, {
623622 submenu . removeAttribute ( 'style' ) ;
624623 buttons [ i ] . classList . remove ( 'active' ) ;
625624 }
626- _this . subNavOpen = false ;
627625 destroy ( ) ;
628626 }
629627 buttons [ i ] . addEventListener ( 'mouseenter' , function ( e ) {
@@ -632,7 +630,9 @@ Ext.extend(MODx.Layout, Ext.Viewport, {
632630 } ) ;
633631 buttons [ i ] . querySelectorAll ( 'a' ) [ 0 ] . addEventListener ( 'focus' , function ( e ) {
634632 e . stopPropagation ( ) ;
635- show ( this . parentNode ) ;
633+ requestAnimationFrame ( ( ) => {
634+ show ( this . parentNode ) ;
635+ } ) ;
636636 } ) ;
637637 buttons [ i ] . addEventListener ( 'mouseleave' , function ( e ) {
638638 e . stopPropagation ( ) ;
0 commit comments