Вы можете быстро создать плоский список всех li
элементов в своем иерархическом дереве DOM и просмотреть этот список визуально с помощью клавиш со стрелками:
// Flat list of all `li` elements (in expected order)
let allLiElems = Array.from(document.getElementById('g1').getElementsByTagName('li'));
let liInd = null;
let highlightAtInd = ind => {
// Remove highlight from previous node
if (liInd !== null) allLiElems[liInd].classList.remove('highlight');
// Apply highlight to next node
liInd = ind;
allLiElems[liInd].classList.add('highlight');
};
window.addEventListener('keydown', evt => {
if (![ 38, 40 ].includes(evt.keyCode)) return;
// Get the new index; ensure it doesn't over/underflow
let newInd = liInd + ((evt.keyCode === 38) ? -1 : +1);
if (newInd < 0) newInd = allLiElems.length - 1;
if (newInd >= allLiElems.length) newInd = 0;
highlightAtInd(newInd);
evt.preventDefault();
});
// Initially highlight the 1st node
highlightAtInd(0);
* { overflow: hidden !important; }
#g1 { font-size: 11px; /* I want this to fit in the preview box */ }
.highlight {
background-color: rgba(255, 0, 0, 0.3);
}
<ul id='g1' class="special">
<ul id='generation2'>
<li>John Williams</li>
<li>Filippa Williams</li>
<ul id='generation3'>
<li>Juan James</li>
<li>Catarina James</li>
<li>Aoifa James</li>
</ul>
<li>Juan Williams</li>
</ul>
<li>Mark Williams</li>
<li>Christina Johnson</li>
<li>Christina Johnson</li>
<li>Christina Johnson</li>
<li>Juan Williams</li>
<li>Juan Williams</li>
<ul id='generation2'>
<li>John Williams</li>
<li>Filippa Williams</li>
</ul>
</ul>
Убедитесь, что вы сфокусировали окно, прежде чем пытаться выполнить ключевые события!