您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Focus the first visible input text field when you press Esc key, or restore the previously focused element on second press
当前为
- // ==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.6
- // @include *
- // @author wOxxOm
- // @namespace wOxxOm.scripts
- // @license MIT License
- // @run-at document-start
- // ==/UserScript==
- var TEXT_FIELD = ' search text number url ';
- var previousElement;
- var scrollPos;
- var first;
- document.addEventListener('keydown', function (e) {
- if (e.keyCode !== 27 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
- return;
- }
- if (window !== top) {
- top.postMessage(GM_info.script.name, '*');
- e.preventDefault();
- e.stopPropagation();
- return;
- }
- run();
- }, true);
- window.addEventListener('message', function (e) {
- if (e.data === GM_info.script.name) {
- run({relayedFromFrame: true});
- }
- });
- function run(params) {
- // 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++) {
- var priority = TEXT_FIELD.indexOf(' ' + input.type + ' ');
- if (priority < 0) continue;
- var n = input, style;
- while (n && n.style && (style = getComputedStyle(n)) && style.display !== 'none' && style.visibility !== 'hidden') {
- n = n.parentNode;
- }
- // visible if reached DOM root
- if (n && n.style) continue;
- // set the first OR if it's empty, try to select an identically named input field with some text (happens on some sites)
- if (!first || (
- input.value &&
- input.name === first.name && (
- !input.form &&
- !first.form || input.form.action === first.form.action
- )
- )) {
- first = input;
- if (first.value) break;
- }
- }
- if (!first) return;
- var invoke = params && params.relayedFromFrame ? passthru : onkeyup;
- if (first !== document.activeElement) {
- // switch to the found input field
- previousElement = document.activeElement;
- scrollPos = [scrollX, scrollY];
- invoke(setFocus);
- } else if (previousElement) {
- invoke(restoreFocus);
- }
- }
- function setFocus() {
- first.focus();
- first.select();
- }
- function restoreFocus() {
- // in case document.body (page "background") was previously selected
- document.activeElement.blur();
- previousElement.focus();
- scrollTo(scrollPos[0], scrollPos[1]);
- }
- // 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) return;
- document.removeEventListener('keyup', keyup);
- cb(e);
- });
- }
- function passthru(fn) {
- return fn.apply(this, arguments);
- }