Support using keyboard to follow search results

This commit is contained in:
Magnus Hoff 2017-10-25 13:49:00 +02:00
parent 056f1ddf72
commit 2939dfaf9c
3 changed files with 31 additions and 4 deletions

View file

@ -45,9 +45,10 @@ function debouncer(interval, callback) {
}).then(result => {
while (results.lastChild) results.removeChild(results.lastChild);
result.hits.forEach(hit => {
result.hits.forEach((hit, index) => {
const item = resultPrototype.cloneNode(true);
item.querySelector('.link').href = hit.slug || ".";
item.querySelector('.link').setAttribute("data-focusindex", index + 1);
item.querySelector('.title').textContent = hit.title;
item.querySelector('.snippet').textContent = hit.snippet;
results.appendChild(item);
@ -71,4 +72,26 @@ function debouncer(interval, callback) {
// We are now actually losing focus from the form:
form.classList.remove("focus");
});
function moveFocus(delta) {
const focusIndexText = document.activeElement.getAttribute("data-focusindex");
if (!focusIndexText) return;
const currentIndex = parseInt(focusIndexText, 10);
const nextIndex = currentIndex + delta;
const candidate = form.querySelector("[data-focusindex=\"" + nextIndex + "\"]");
if (candidate) candidate.focus();
}
form.addEventListener('keydown', function (ev) {
if (ev.key === 'ArrowUp') {
ev.preventDefault();
ev.stopPropagation();
moveFocus(-1);
} else if (ev.key === 'ArrowDown') {
ev.preventDefault();
ev.stopPropagation();
moveFocus(1);
}
});
})();

View file

@ -361,11 +361,15 @@ article ul.search-results {
text-decoration: none;
padding: 8px;
}
.live-results .search-result a:hover {
.live-results .search-result a:hover, .live-results .search-result a:focus {
background: #0074D9;
color: white;
}
.live-results .search-result .title {
font-weight: bold;
}
.prototype {
display: none;
}

View file

@ -9,11 +9,11 @@
</head>
<body>
<form class=search action=_search method=GET>
<input type=search name=q placeholder=search autocomplete=off>
<input data-focusindex="0" type=search name=q placeholder=search autocomplete=off>
<ul class="live-results search-results">
</ul>
</form>
<ul id="search-result-prototype" class="prototype"><li class="search-result" tabindex="0"><a class="link" href=""><span class="title"></span> &ndash; <span class="snippet"></span></a></li></ul>
<ul id="search-result-prototype" class="prototype"><li class="search-result"><a class="link" href=""><span class="title"></span> &ndash; <span class="snippet"></span></a></li></ul>
<script src="_assets/search-{{search_js_checksum()}}.js" defer></script>
{{{body}}}
</body>