Focus input text field on Esc

Focus the first visible input text field when you press Esc key, or restore the previously focused element on second press

Verze ze dne 28. 04. 2015. Zobrazit nejnovější verzi.

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name          Focus input text field on Esc
// @description   Focus the first visible input text field when you press Esc key, or restore the previously focused element on second press
// @version       1.0.3
// @author        wOxxOm
// @namespace     wOxxOm.scripts
// @license       MIT License
// @run-at        document-start
// ==/UserScript==

var TEXT_FIELD = ' text number search url ';
var previousElement;
var first;

document.addEventListener('keydown', function(e) {
  if (e.keyCode != 27 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey)
    return;
  // find text inputs inside visible DOM containers
  var inputs = document.getElementsByTagName('input');
  for (var i=0, input, il=inputs.length; i<il && (input=inputs[i]); i++)
    if (TEXT_FIELD.indexOf(' '+input.type+' ') >= 0) {
      var n=input, style;
      while (n && n.style && (style=getComputedStyle(n)) && style.display!='none' && style.visibility!='hidden')
        n = n.parentNode;
      if (!n || !n.style) {
        if (!first // set the first OR if it's empty, try to select an identically named input field with some text (happens on some sites)
            || (input.value && input.name == first.name && (!input.form && !first.form || input.form.action == first.form.action))) {
          first = input;
          if (first.value)
            break;
        }
      }
    }

  if (first) {
    if (first != document.activeElement) {
      // switch to the found input field
      previousElement = document.activeElement;
      onkeyup(function(){
        first.focus();
        first.select();
      });
    } else if (previousElement) {
      // restore focus to the element from which we jumped to an input field previously
      onkeyup(function(){
        document.activeElement.blur(); // in case document.body (page "background") was previously selected
        previousElement.focus();
      });
    }
  }

  // focusing should be done at key-up to prevent the Esc-keydown being also chain-handled by the just focused element
  function onkeyup(cb) {
    document.addEventListener('keyup', function keyup(e) {
      if (e.keyCode == 27) {
        document.removeEventListener('keyup', keyup);
        cb(e);          
      }
    });
  }
});