Link & Form Field Navigation Shortcuts

Adds keyboard shortcuts for focusing: previous form field (ALT+1), next form field (ALT+2), previous link (ALT+3), and next link (ALT+4).

  1. // ==UserScript==
  2. // @name Link & Form Field Navigation Shortcuts
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0.1
  5. // @license AGPL v3
  6. // @description Adds keyboard shortcuts for focusing: previous form field (ALT+1), next form field (ALT+2), previous link (ALT+3), and next link (ALT+4).
  7. // @author jcunews
  8. // @match *://*/*
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. function isElementFocusable(ele, css) {
  13. while (ele && (ele !== document)) {
  14. if (!ele.offsetWidth || !ele.offsetHeight || ((css = getComputedStyle(ele)) && (css.display === "none"))) return false;
  15. ele = ele.parentNode;
  16. }
  17. return true;
  18. }
  19.  
  20. addEventListener("keypress", function(ev, eles, i) {
  21. if ((["1", "2"].indexOf(ev.key) >= 0) && !ev.location && ev.altKey && !ev.ctrlKey) {
  22. eles = Array.prototype.slice.call(document.querySelectorAll("input, select, textarea"));
  23. if (document.activeElement && (["INPUT", "SELECT", "TEXTAREA"].indexOf(document.activeElement.tagName) >= 0)) {
  24. eles.some(function(ele, i) {
  25. if (ele === document.activeElement) {
  26. ele = ev.key === "1" ? eles[i - 1] || eles[eles.length - 1] : eles[i + 1] || eles[0];
  27. while (ele) {
  28. if (isElementFocusable(ele)) {
  29. ele.focus();
  30. ele.scrollIntoView(false);
  31. return true;
  32. }
  33. i += ev.key === "1" ? -1 : 1;
  34. ele = eles[i];
  35. }
  36. }
  37. });
  38. } else if (ele = eles[ev.key === "1" ? eles.length - 1 : 0]) {
  39. ele.scrollIntoView();
  40. ele.focus();
  41. }
  42. } else if ((["3", "4"].indexOf(ev.key) >= 0) && !ev.location && ev.altKey && !ev.ctrlKey) {
  43. eles = Array.prototype.slice.call(document.querySelectorAll("a"));
  44. if (document.activeElement && (document.activeElement.tagName === "A")) {
  45. eles.some(function(ele, i) {
  46. if (ele === document.activeElement) {
  47. ele = ev.key === "3" ? eles[i - 1] || eles[eles.length - 1] : eles[i + 1] || eles[0];
  48. while (ele) {
  49. if (ele.href && isElementFocusable(ele)) {
  50. ele.focus();
  51. ele.scrollIntoView(false);
  52. return true;
  53. }
  54. i += ev.key === "1" ? -1 : 1;
  55. ele = eles[i];
  56. }
  57. }
  58. });
  59. } else if (ele = eles[ev.key === "3" ? eles.length - 1 : 0]) {
  60. ele.scrollIntoView();
  61. ele.focus();
  62. }
  63. }
  64. });