Google search results arrow key navigation

Enable arrow key navigation through google search results

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         Google search results arrow key navigation
// @namespace    http://tampermonkey.net/
// @version      3.2
// @description  Enable arrow key navigation through google search results
// @author       Sandro Bürki
// @include      /^https?://www\.google\.[^/]*/search\?/
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
// @grant        none
// ==/UserScript==

// config constants
const resultContainerClass = 'tF2Cxc';
const mainResultLinkContainerClass = 'yuRUbf';
const subResultLinkClass = 'l';


$(document).ready(function() {

  let linkPointer = -1;
  let resultLinks;
  let queryInputField;

  $(document).keydown(function(e) {
    console.log(e.which);
    switch (e.which) {
      case 38: // up
        resultLinks = findResultLinks();

        linkPointer--;
        if (resultLinks[linkPointer]) {
          resultLinks[linkPointer].focus();
        }
        return false;
      case 40: // down
        resultLinks = findResultLinks();

        linkPointer++;
        if (resultLinks[linkPointer]) {
          resultLinks[linkPointer].focus();
        }
        return false;
      case 8: // backspace
        queryInputField = document.querySelector('input[name="q"]');
        if (document.activeElement.tagName === 'INPUT') {
            return;
        }
        if (!queryInputField.length) {
          var tmp = queryInputField.value;
          console.log(tmp);
          queryInputField.focus();
          queryInputField.value = '';
          queryInputField.value = tmp;
        }
        break;
      case 13: // enter
    }
  });
});

function findResultLinks() {
  let resultLinks = [];
  const resultContainers = document.getElementsByClassName(resultContainerClass);

  for (let i = 0; i < resultContainers.length; i++) {
    const mainResultLink = resultContainers[i].querySelector('.' + mainResultLinkContainerClass + ' > a');

    const subResultLinks = document.querySelectorAll('a.' + subResultLinkClass);
    console.log(subResultLinks);

    resultLinks.push(mainResultLink);
    resultLinks.concat(subResultLinks);
  }

  return resultLinks;
}