You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.5 KiB
69 lines
1.5 KiB
var currentIndex = 0 |
|
|
|
function findScrollParent(node) { |
|
if (!node) { |
|
return node |
|
} |
|
|
|
if (node.classList.contains('content') || node.tagName === 'body') { |
|
return node |
|
} |
|
else { |
|
return findScrollParent(node.parentNode) |
|
} |
|
} |
|
|
|
function nav(offset) { |
|
var items = document.querySelectorAll('.items:not(.disabled)') |
|
|
|
currentIndex += offset |
|
if (currentIndex < 0) { |
|
currentIndex += items.length |
|
} |
|
if (currentIndex >= items.length) { |
|
currentIndex -= items.length |
|
} |
|
items[currentIndex].focus() |
|
if (items[currentIndex].getBoundingClientRect().y + items[currentIndex].getBoundingClientRect().height + 50 > document.documentElement.scrollHeight) { |
|
findScrollParent(items[currentIndex]).scrollBy(0, 50) |
|
} |
|
items[currentIndex].addEventListener('keydown', handleKeyDown) |
|
} |
|
|
|
function handleKeyDown(e) { |
|
if (e.target.classList.contains('items')) { |
|
switch (e.key) { |
|
case 'ArrowUp': |
|
e.preventDefault() |
|
e.stopPropagation() |
|
nav(-1) |
|
break |
|
case 'ArrowDown': |
|
e.preventDefault() |
|
e.stopPropagation() |
|
nav(1) |
|
break |
|
} |
|
} |
|
else if (e.target.name !== 'INPUT') { |
|
switch (e.key) { |
|
case 'ArrowUp': |
|
case 'ArrowDown': |
|
e.preventDefault() |
|
e.stopPropagation() |
|
nav(0) |
|
break |
|
} |
|
} |
|
} |
|
|
|
window.addEventListener('load', function (e) { |
|
// Select first item |
|
var items = document.querySelectorAll('.items:not(.disabled)') |
|
if (items.length > 0) { |
|
items[0].focus() |
|
items[0].addEventListener('keydown', handleKeyDown) |
|
} |
|
|
|
document.body.addEventListener('keydown', handleKeyDown) |
|
})
|
|
|