mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge pull request #4330 from dmitrylyzo/fix-navigation-input
Fix navigation for some types of INPUT
This commit is contained in:
commit
7e99e3ec51
1 changed files with 25 additions and 2 deletions
|
@ -50,6 +50,11 @@ const NavigationKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'];
|
||||||
*/
|
*/
|
||||||
const InteractiveElements = ['INPUT', 'TEXTAREA'];
|
const InteractiveElements = ['INPUT', 'TEXTAREA'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Types of INPUT element for which navigation shouldn't be constrained.
|
||||||
|
*/
|
||||||
|
const NonInteractiveInputElements = ['button', 'checkbox', 'color', 'file', 'hidden', 'image', 'radio', 'reset', 'submit'];
|
||||||
|
|
||||||
let hasFieldKey = false;
|
let hasFieldKey = false;
|
||||||
try {
|
try {
|
||||||
hasFieldKey = 'key' in new KeyboardEvent('keydown');
|
hasFieldKey = 'key' in new KeyboardEvent('keydown');
|
||||||
|
@ -84,6 +89,24 @@ export function isNavigationKey(key) {
|
||||||
return NavigationKeys.indexOf(key) != -1;
|
return NavigationKeys.indexOf(key) != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns _true_ if the element is interactive.
|
||||||
|
*
|
||||||
|
* @param {Element} element - Element.
|
||||||
|
* @return {boolean} _true_ if the element is interactive.
|
||||||
|
*/
|
||||||
|
export function isInteractiveElement(element) {
|
||||||
|
if (element && InteractiveElements.includes(element.tagName)) {
|
||||||
|
if (element.tagName === 'INPUT') {
|
||||||
|
return !NonInteractiveInputElements.includes(element.type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
export function enable() {
|
export function enable() {
|
||||||
window.addEventListener('keydown', function (e) {
|
window.addEventListener('keydown', function (e) {
|
||||||
const key = getKeyName(e);
|
const key = getKeyName(e);
|
||||||
|
@ -97,7 +120,7 @@ export function enable() {
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case 'ArrowLeft':
|
case 'ArrowLeft':
|
||||||
if (!InteractiveElements.includes(document.activeElement?.tagName)) {
|
if (!isInteractiveElement(document.activeElement)) {
|
||||||
inputManager.handleCommand('left');
|
inputManager.handleCommand('left');
|
||||||
} else {
|
} else {
|
||||||
capture = false;
|
capture = false;
|
||||||
|
@ -107,7 +130,7 @@ export function enable() {
|
||||||
inputManager.handleCommand('up');
|
inputManager.handleCommand('up');
|
||||||
break;
|
break;
|
||||||
case 'ArrowRight':
|
case 'ArrowRight':
|
||||||
if (!InteractiveElements.includes(document.activeElement?.tagName)) {
|
if (!isInteractiveElement(document.activeElement)) {
|
||||||
inputManager.handleCommand('right');
|
inputManager.handleCommand('right');
|
||||||
} else {
|
} else {
|
||||||
capture = false;
|
capture = false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue