Auto-focus on first textbox

Auto-focuses on the first/main textbox of a site

  1. // ==UserScript==
  2. // @name Auto-focus on first textbox
  3. // @namespace http://userscripts.org/users/23652
  4. // @description Auto-focuses on the first/main textbox of a site
  5. // @include http://*.youtube.com/*
  6. // @include https://*.youtube.com/*
  7. // @include http://*.facebook.com/*
  8. // @include https://*.facebook.com/*
  9. // @include http://*
  10. // @include https://*
  11. // @exclude file://*
  12. // @copyright JoeSimmons
  13. // @version 1.0.4
  14. // @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html
  15. // @grant GM_addStyle
  16. // ==/UserScript==
  17.  
  18. /* CHANGELOG
  19.  
  20. 1.0.4 (4/30/2015)
  21. - added a system where it makes sure the textbox is focused, especially for trouble sites like youtube
  22.  
  23. 1.0.3 (1/30/2015)
  24. - added some small delays for YouTube for it to work
  25. - removed the use of JSL; it's unnecessary
  26.  
  27. */
  28.  
  29. (function () {
  30. 'use strict';
  31.  
  32. // make sure the page is not in a frame
  33. if (window.frameElement || window !== window.top) { return; }
  34.  
  35. var domain = window.document.domain,
  36. rDomain = /([a-z0-9]+\.)?([a-z0-9-]+(\.[a-z0-9]+)+)$/,
  37. site = '',
  38. delay = 500, // by default, use a fairly slow interval as most sites don't mess with focus too much
  39. e = document.querySelector('input[type="text"], input[type="search"], textarea'),
  40. timeStart = Date.now(),
  41. cancelled = false,
  42. len, intv;
  43.  
  44. function cancel () {
  45. if (cancelled === false) {
  46. cancelled = true;
  47. window.clearInterval(intv);
  48.  
  49. window.removeEventListener('keydown', cancel, false);
  50. window.removeEventListener('mousedown', cancel, false);
  51. window.removeEventListener('dblclick', cancel, false);
  52. window.removeEventListener('dragstart', cancel, false);
  53. window.removeEventListener('scroll', cancel, false);
  54. window.removeEventListener('unload', cancel, false);
  55. }
  56. }
  57.  
  58. function doFocus(element, length) {
  59. var diff = Date.now() - timeStart;
  60.  
  61. // don't run this function after user input is detected
  62. if (cancelled === true) {
  63. return;
  64. }
  65.  
  66. // focus the text box
  67. element.focus();
  68.  
  69. // highlight its text
  70. if (length > 0 && typeof element.setSelectionRange === 'function') {
  71. element.setSelectionRange(length, length);
  72. }
  73.  
  74. // stop focusing if 10 seconds has passed
  75. if (diff > 9999) {
  76. cancel();
  77. }
  78. }
  79.  
  80. // grab the domain minus the subdomain
  81. if ( domain.match(rDomain) ) {
  82. site = domain.match(rDomain)[2];
  83. }
  84.  
  85. // this section is for sites that require special attention ;)
  86. switch (site) {
  87. case 'youtube.com': {
  88. // youtube is known to take focus away after it's been focused, so we do it often
  89. e = document.querySelector('#masthead-search-term');
  90. delay = 100;
  91. break;
  92. }
  93. case 'userscripts.org': case 'google.com': {
  94. e = document.querySelector('input[name="q"]');
  95. break;
  96. }
  97. case 'facebook.com': {
  98. e = document.querySelector('textarea[name="xhpc_message_text"], textarea[name="xhpc_message"]');
  99. delay = 750;
  100. break;
  101. }
  102. }
  103.  
  104. // if the element exists and is visible (in-view), then proceed
  105. if (e && Math.max(e.offsetWidth, e.offsetHeight) > 0) {
  106. len = e.value.length;
  107.  
  108. if (typeof e.focus === 'function') {
  109. // keep auto-focusing until the user inputs an action, but not longer than 10 seconds
  110. intv = window.setInterval(doFocus, delay, e, len);
  111.  
  112. window.addEventListener('keydown', cancel, false);
  113. window.addEventListener('mousedown', cancel, false);
  114. window.addEventListener('dblclick', cancel, false);
  115. window.addEventListener('dragstart', cancel, false);
  116. window.addEventListener('scroll', cancel, false);
  117. window.addEventListener('unload', cancel, false);
  118. }
  119. }
  120. }());