Keyboard nav fixes (seek & focus trap in fullscreen), SASS updates
This commit is contained in:
		| @ -835,6 +835,44 @@ | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Trap focus inside container | ||||
|         function _focusTrap() { | ||||
|             var tabbables   = _getElements('input:not([disabled]), button:not([disabled])'), | ||||
|                 first       = tabbables[0], | ||||
|                 last        = tabbables[tabbables.length - 1]; | ||||
|  | ||||
|             function _checkFocus(event) { | ||||
|                 // If it is TAB | ||||
|                 if (event.which === 9 && plyr.isFullscreen) { | ||||
|                     // Move focus to first element that can be tabbed if Shift isn't used | ||||
|                     if (event.target === last && !event.shiftKey) { | ||||
|                         event.preventDefault(); | ||||
|                         first.focus(); | ||||
|                     } | ||||
|                     // Move focus to last element that can be tabbed if Shift is used | ||||
|                     else if (event.target === first && event.shiftKey) { | ||||
|                         event.preventDefault(); | ||||
|                         last.focus(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Bind the handler | ||||
|             _on(plyr.container, 'keydown', _checkFocus); | ||||
|         } | ||||
|  | ||||
|         // Add elements to HTML5 media (source, tracks, etc) | ||||
|         function _insertChildElements(type, attributes) { | ||||
|             if (typeof attributes === 'string') { | ||||
|                _insertElement(type, plyr.media, { src: attributes }); | ||||
|             } | ||||
|             else if (attributes.constructor === Array) { | ||||
|                 for (var i = attributes.length - 1; i >= 0; i--) { | ||||
|                     _insertElement(type, plyr.media, attributes[i]); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Insert controls | ||||
|         function _injectControls() { | ||||
|             // Make a copy of the html | ||||
| @ -1481,6 +1519,9 @@ | ||||
|                 // Toggle state | ||||
|                 _toggleState(plyr.buttons.fullscreen, false); | ||||
|  | ||||
|                 // Setup focus trap | ||||
|                 _focusTrap(); | ||||
|  | ||||
|                 // Set control hide class hook | ||||
|                 if (config.fullscreen.hideControls) { | ||||
|                     _toggleClass(plyr.container, config.classes.fullscreen.hideControls, true); | ||||
| @ -1642,6 +1683,17 @@ | ||||
|             // Set class hook | ||||
|             _toggleClass(plyr.container, config.classes.fullscreen.active, plyr.isFullscreen); | ||||
|  | ||||
|             // Trap focus | ||||
|             if(plyr.isFullscreen) { | ||||
|                 plyr.container.setAttribute('tabindex', '-1'); | ||||
|             } | ||||
|             else { | ||||
|                 plyr.container.removeAttribute('tabindex'); | ||||
|             } | ||||
|  | ||||
|             // Trap focus | ||||
|             _focusTrap(plyr.isFullscreen); | ||||
|  | ||||
|             // Set button state | ||||
|             _toggleState(plyr.buttons.fullscreen, plyr.isFullscreen); | ||||
|  | ||||
| @ -1940,18 +1992,6 @@ | ||||
|             _updateProgress(event); | ||||
|         } | ||||
|  | ||||
|         // Add elements to HTML5 media (source, tracks, etc) | ||||
|         function _insertChildElements(type, attributes) { | ||||
|             if (typeof attributes === 'string') { | ||||
|                _insertElement(type, plyr.media, { src: attributes }); | ||||
|             } | ||||
|             else if (attributes.constructor === Array) { | ||||
|                 for (var i = attributes.length - 1; i >= 0; i--) { | ||||
|                     _insertElement(type, plyr.media, attributes[i]); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Add common function to retrieve media source | ||||
|         function _source(source) { | ||||
|             // If not null or undefined, parse it | ||||
|  | ||||
		Reference in New Issue
	
	Block a user