Ticket #48894: 48894.patch
| File 48894.patch, 6.0 KB (added by , 5 years ago) |
|---|
-
src/js/_enqueues/lib/admin-bar.js
16 16 document.addEventListener( 'DOMContentLoaded', function() { 17 17 var adminBar = document.getElementById( 'wpadminbar' ), 18 18 topMenuItems, 19 toggleMenuItems, 19 20 allMenuItems, 20 21 adminBarLogout, 21 22 adminBarSearchForm, … … 30 31 } 31 32 32 33 topMenuItems = adminBar.querySelectorAll( 'li.menupop' ); 34 toggleMenuItems = adminBar.querySelectorAll( 'li.menupop > .ab-item' ); 33 35 allMenuItems = adminBar.querySelectorAll( '.ab-item' ); 34 36 adminBarLogout = document.getElementById( 'wp-admin-bar-logout' ); 35 37 adminBarSearchForm = document.getElementById( 'adminbarsearch' ); … … 56 58 } 57 59 58 60 adminBar.removeEventListener( 'touchstart', bindMobileEvents ); 61 62 for ( i = 0; i < toggleMenuItems.length; i++ ) { 63 // Remove click and keyboard event handlers that interfere with mobile behaviour. 64 toggleMenuItems[i].removeEventListener( 'keydown', handleKeyDown ); 65 toggleMenuItems[i].removeEventListener( 'keyup', handleKeyUp ); 66 toggleMenuItems[i].removeEventListener( 'click', handleClick ); 67 } 59 68 } ); 60 69 } 61 70 71 document.addEventListener( 'click', closeOpenMenus ); 72 document.addEventListener( 'keyup', closeOpenMenus ); 73 62 74 // Scroll page to top when clicking on the admin bar. 63 75 adminBar.addEventListener( 'click', scrollToTop ); 64 76 65 for ( i = 0; i < topMenuItems.length; i++ ) {66 // Adds or removes the hover class based on the hover intent.67 window.hoverintent(68 topMenuItems[i],69 addClass.bind( null, topMenuItems[i], 'hover' ),70 removeClass.bind( null, topMenuItems[i], 'hover' )71 ).options( {72 timeout: 18073 } );74 75 // Toggle hover class if the enter key is pressed.76 topMenuItems[i].addEventListener( 'keydown', toggleHoverIfEnter );77 }78 79 77 // Remove hover class if the escape key is pressed. 80 78 for ( i = 0; i < allMenuItems.length; i++ ) { 81 79 allMenuItems[i].addEventListener( 'keydown', removeHoverIfEscape ); 82 80 } 83 81 82 for ( i = 0; i < toggleMenuItems.length; i++ ) { 83 // Make the menu dropdown toggles be perceived and behave as buttons. 84 toggleMenuItems[i].setAttribute( 'role', 'button' ); 85 toggleMenuItems[i].setAttribute( 'aria-expanded', 'false' ); 86 87 // Prevent default for Space. 88 toggleMenuItems[i].addEventListener( 'keydown', handleKeyDown ); 89 // Handle opening/closing menus with Space. 90 toggleMenuItems[i].addEventListener( 'keyup', handleKeyUp ); 91 // Handle opening/closing menus with click. 92 toggleMenuItems[i].addEventListener( 'click', handleClick ); 93 } 94 84 95 if ( adminBarSearchForm ) { 85 96 adminBarSearchInput = document.getElementById( 'adminbar-search' ); 86 97 … … 114 125 adminBarLogout.addEventListener( 'click', emptySessionStorage ); 115 126 } 116 127 } ); 128 129 /** 130 * Closes all open menus. 131 * 132 * @since 5.6.0 133 * 134 * @param {Event} event The captured event. 135 */ 136 function closeOpenMenus( event ) { 137 for ( i = 0; i < toggleMenuItems.length; i++ ) { 138 var wrapper = getClosest( toggleMenuItems[i], '.menupop' ); 139 if ( wrapper.contains( event.target ) ) { 140 continue; 141 } 142 if ( wrapper.classList.contains( 'hover' ) ) { 143 wrapper.classList.remove( 'hover' ); 144 } 145 if ( toggleMenuItems[i].getAttribute('aria-expanded') === 'true' ) { 146 toggleMenuItems[i].setAttribute( 'aria-expanded', 'false' ); 147 } 148 } 149 } 117 150 118 151 /** 152 * Updates the My Account menu aria-expanded attribute. 153 * 154 * @since 5.6.0 155 * 156 * @param {HTMLElement} element The element to toggle aria-expanded on. 157 */ 158 function toggleAriaExpanded( element ) { 159 if ( element.getAttribute('aria-expanded') === 'true' ) { 160 element.setAttribute( 'aria-expanded', 'false' ); 161 } else { 162 element.setAttribute( 'aria-expanded', 'true' ); 163 } 164 } 165 166 /** 119 167 * Remove hover class for top level menu item when escape is pressed. 120 168 * 121 169 * @since 5.3.1 … … 123 171 * @param {Event} event The keydown event. 124 172 */ 125 173 function removeHoverIfEscape( event ) { 126 var wrapper; 174 var wrapper, 175 toggle; 127 176 128 177 if ( event.which !== 27 ) { 129 178 return; … … 131 180 132 181 wrapper = getClosest( event.target, '.menupop' ); 133 182 183 toggle = wrapper.querySelector( '.menupop > .ab-item' ); 184 134 185 if ( ! wrapper ) { 135 186 return; 136 187 } 137 188 138 wrapper.querySelector( '.menupop > .ab-item' ).focus(); 189 toggle.focus(); 190 toggleAriaExpanded( toggle ); 139 191 removeClass( wrapper, 'hover' ); 140 192 } 141 193 142 194 /** 143 * Toggle hover class for top level menu item when enter is pressed.195 * Handles the click event on dropdown toggles. 144 196 * 145 * @since 5. 3.1197 * @since 5.6.0 146 198 * 199 * @param {Event} event The click event. 200 */ 201 function handleClick( event ) { 202 event.preventDefault(); 203 var wrapper = getClosest( event.target, '.menupop' ); 204 wrapper.classList.toggle( 'hover' ); 205 toggleAriaExpanded( getClosest( event.target, '.ab-item' ) ); 206 } 207 208 /** 209 * Handles the keydown event on dropdown toggles. 210 * 211 * @since 5.6.0 212 * 147 213 * @param {Event} event The keydown event. 148 214 */ 149 function toggleHoverIfEnter( event ) { 150 var wrapper; 151 152 if ( event.which !== 13 ) { 153 return; 215 function handleKeyDown( event ) { 216 if ( event.which === 32 ) { 217 event.preventDefault(); 154 218 } 219 } 155 220 156 if ( !! getClosest( event.target, '.ab-sub-wrapper' ) ) { 221 /** 222 * Handles the keyup event on dropdown toggles. 223 * 224 * @since 5.6.0 225 * 226 * @param {Event} event The keyup event. 227 */ 228 function handleKeyUp( event ) { 229 if ( event.which !== 32 ) { 157 230 return; 158 231 } 159 232 160 wrapper = getClosest( event.target, '.menupop' );233 var wrapper = getClosest( event.target, '.menupop' ); 161 234 162 if ( ! wrapper ) { 235 if ( 236 ! wrapper || 237 !! getClosest( event.target, '.ab-sub-wrapper' ) 238 ) { 163 239 return; 164 240 } 165 241 166 242 event.preventDefault(); 167 243 168 if ( hasClass( wrapper, 'hover' ) ) { 169 removeClass( wrapper, 'hover' ); 170 } else { 171 addClass( wrapper, 'hover' ); 172 } 244 wrapper.classList.toggle( 'hover' ); 245 toggleAriaExpanded( event.target ); 173 246 } 174 247 175 248 /**