您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
进页面聚焦到第一个搜索框中,默认使用ctrl+q可手动触发,可自定义快捷键
// ==UserScript== // @name 自动聚焦第一个输入框,可自定义快捷键 // @name:en auto focus on first <input> // @namespace @Vinsea // @version 1.0.0 // @description 进页面聚焦到第一个搜索框中,默认使用ctrl+q可手动触发,可自定义快捷键 // @description:en auto foucs on first input box // @author Vinsea // @match * // @match http*://*/* // @run-at document-idle // @grant GM.registerMenuCommand // @grant GM.setValue // @grant GM.getValue // @grant GM.listValues // @license MIT // ==/UserScript== function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } (function () { 'use strict'; var CONFIG = { preventScroll: '0', shortcut: ['ctrl', '', 'q'] }; var claz = function claz(val) { return "".concat(val, "__tampermonkey"); }; var addStyle = function addStyle(aCss) { var head = document.getElementsByTagName('head')[0]; if (head) { var style = document.createElement('style'); style.setAttribute('type', 'text/css'); style.textContent = aCss; head.appendChild(style); return style; } return null; }; var store = { set: function set(name, value) { GM.setValue(name, value); }, get: function get(name) { return GM.getValue(name); } }; var config = { set: function set(conf) { for (var _i = 0, _Object$entries = Object.entries(conf); _i < _Object$entries.length; _i++) { var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), k = _Object$entries$_i[0], v = _Object$entries$_i[1]; CONFIG[k] = v; store.set(k, v); } }, get: function get() { return CONFIG; } }; var initConfig = function initConfig() { var configPromise = Object.keys(CONFIG).map(function (v) { return store.get(v); }); return Promise.all(configPromise).then(function (r) { if (!r[0]) { for (var _i2 = 0, _Object$entries2 = Object.entries(CONFIG); _i2 < _Object$entries2.length; _i2++) { var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2), k = _Object$entries2$_i[0], v = _Object$entries2$_i[1]; store.set(k, v); } } else { Object.keys(CONFIG).forEach(function (v, i) { CONFIG[v] = r[i]; }); } }); }; var bodyOverflow = document.body.style.overflow; var Dialog = /*#__PURE__*/function () { function Dialog(opt) { _classCallCheck(this, Dialog); this.option = Object.assign({ header: '提示', content: '', okText: '确认', cancelText: '取消', onOk: function onOk() { return {}; }, onCancel: function onCancel() { return {}; } }, opt); this.init(); } _createClass(Dialog, [{ key: "init", value: function init() { var _this = this; this.wrapper = document.createElement('div'); this.wrapper.classList.add(claz('vv-dialog-wrapper')); var container = document.createElement('div'); container.classList.add(claz('vv-dialog')); this.wrapper.appendChild(container); var header = document.createElement('div'); header.classList.add(claz('vv-dialog-header')); header.textContent = this.option.header; container.appendChild(header); this.body = document.createElement('div'); this.body.classList.add(claz('vv-dialog-body')); container.appendChild(this.body); if (this.option.content) { var text = document.createTextNode(this.option.content); this.body.appendChild(text); } this.tip = document.createElement('div'); this.tip.classList.add(claz('vv-dialog-tip')); container.appendChild(this.tip); var footer = document.createElement('div'); footer.classList.add(claz('vv-dialog-footer')); container.appendChild(footer); var cancel = document.createElement('button'); cancel.textContent = this.option.cancelText; cancel.addEventListener('click', function () { _this.option.onCancel(); _this.close(); }); footer.appendChild(cancel); var ok = document.createElement('button'); ok.textContent = this.option.okText; ok.addEventListener('click', this.option.onOk); footer.appendChild(ok); } }, { key: "showTip", value: function showTip(text) { this.tip.style.display = 'block'; this.tip.textContent = text; } }, { key: "hideTip", value: function hideTip() { this.tip.style.display = 'none'; } }, { key: "open", value: function open() { document.body.style.overflow = 'hidden'; document.body.appendChild(this.wrapper); } }, { key: "close", value: function close() { document.body.style.overflow = bodyOverflow; document.body.removeChild(this.wrapper); this.body = null; this.wrapper = null; } }]); return Dialog; }(); var getTitle = function getTitle(text) { var p = document.createElement('p'); p.classList.add(claz('vv-setting-title')); p.textContent = text; return p; }; var Settings = /*#__PURE__*/function (_Dialog) { _inherits(Settings, _Dialog); var _super = _createSuper(Settings); function Settings() { var _this2; var opt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Settings); opt.header = '设置'; opt.onCancel = function () { _this2.form = null; }; opt.onOk = function () { var data = new FormData(_this2.form); var shortcut = []; var _iterator = _createForOfIteratorHelper(data), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var entry = _step.value; if (entry[0] === 'preventScroll') { config.set({ 'preventScroll': entry[1] }); } else { shortcut.push(entry[1]); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (shortcut[0] === shortcut[1]) { _this2.showTip('不能有重复键位'); return; } config.set({ 'shortcut': shortcut }); _this2.hideTip(); _this2.close(); }; _this2 = _super.call(this, opt); _this2.initValue(); _this2.initBody(); return _this2; } _createClass(Settings, [{ key: "initValue", value: function initValue() { var configTemp = config.get(); this.preventScroll = configTemp.preventScroll; this.shortcut = configTemp.shortcut; } }, { key: "initBody", value: function initBody() { var _this3 = this; this.form = document.createElement('form'); this.form.appendChild(getTitle('是否自动滚动到聚焦处')); var value = document.createElement('div'); value.classList.add(claz('vv-setting-value')); this.form.appendChild(value); Object.values(['是', '否']).forEach(function (v, i) { var id = String(i); var input = document.createElement('input'); input.type = 'radio'; input.id = id; input.name = 'preventScroll'; input.value = id; if (_this3.preventScroll === id) { input.setAttribute('checked', 'checked'); } var label = document.createElement('label'); label["for"] = input.id; label.textContent = v; value.appendChild(input); value.appendChild(label); }); this.form.appendChild(getTitle('手动聚焦快捷键')); for (var index = 0; index < 2; index++) { var selectShortcut = document.createElement('select'); selectShortcut.name = "shortcut".concat(index + 1); var data = ['ctrl', 'alt', 'shift']; data = index === 1 ? [''].concat(_toConsumableArray(data)) : data; var _iterator2 = _createForOfIteratorHelper(data), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var val = _step2.value; var option = document.createElement('option'); option.value = val; option.textContent = val || '无'; selectShortcut.appendChild(option); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } this.form.appendChild(selectShortcut); } var inputShortcut = document.createElement('input'); inputShortcut.name = 'shortcut3'; inputShortcut.setAttribute('readonly', 'readonly'); inputShortcut.value = this.shortcut[2]; this.form.appendChild(inputShortcut); inputShortcut.addEventListener('keydown', function (e) { if (/^[a-zA-Z]+$/.test(e.key)) { inputShortcut.value = e.key.toLowerCase(); } }); this.body.appendChild(this.form); } }]); return Settings; }(Dialog); /** * init styles * @returns {undefined} */ function initStyle() { addStyle("\n.".concat(claz('vv-dialog-wrapper'), " {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2000;\n background-color: rgba(0,0,0,0.6);\n}\n.").concat(claz('vv-dialog'), " {\n width: 500px;\n position: absolute;\n right: 20px;\n top: 100px;\n background-color: #fff;\n border-radius: 8px;\n box-shadow: 0 0 10px 0 rgb(0 0 0 / 20%);\n box-sizing: border-box;\n}\n.").concat(claz('vv-dialog-header'), " {\n padding: 10px 24px;\n font-size: 16px;\n color: #333;\n line-height: 30px;\n font-weight: bold;\n border-bottom: 1px solid #e9e9e9;\n}\n.").concat(claz('vv-dialog-body'), " {\n padding: 24px;\n font-size: 14px;\n color: #333;\n}\n.").concat(claz('vv-dialog-body'), " form select{\n margin-right: 10px;\n}\n.").concat(claz('vv-dialog-tip'), " {\n font-size: 14px;\n color: #f73131;\n line-height: 20px;\n padding: 0 0 10px 24px;\n}\n.").concat(claz('vv-dialog-footer'), " {\n border-top: 1px solid #e9e9e9;\n padding: 10px 24px;\n text-align: center;\n}\n.").concat(claz('vv-dialog-footer'), " button {\n color: #fff;\n line-height: 30px;\n border: none;\n border-radius: 5px;\n padding: 0 20px;\n margin: 0 5px;\n cursor: pointer;\n background-color: #5aadf9;\n box-sizing: border-box;\n transition: background-color 0.3s;\n}\n.").concat(claz('vv-dialog-footer'), " button:hover {\n background-color: #349bfa;\n}\n.").concat(claz('vv-dialog-footer'), " button:first-child {\n color: #333;\n border-color: #fff;\n background-color: #fff;\n}\n.").concat(claz('vv-setting-title'), " {\n margin: 10px 0 5px;\n}\n")); } /** * focus * @returns {undefined} */ function doFocus() { var preventScroll = config.get().preventScroll === '0'; var firstInput = document.querySelector('input:not([type=hidden])'); if (firstInput) { var val = firstInput.value; firstInput.value = ''; firstInput.focus({ preventScroll: preventScroll }); firstInput.value = val; } } /** * init events * @returns {undefined} */ function initEvents() { GM.registerMenuCommand('设置', function () { var settings = new Settings(); settings.open(); }); document.addEventListener('keydown', function (e) { var _config$get$shortcut = _slicedToArray(config.get().shortcut, 3), key1 = _config$get$shortcut[0], key2 = _config$get$shortcut[1], key3 = _config$get$shortcut[2]; var hasKey2 = key2 ? e["".concat(key2, "Key")] : true; if (e["".concat(key1, "Key")] && hasKey2 && e.key.toLowerCase() === key3) { doFocus(); } }); } /** * entry * @returns {undefined} */ function load() { doFocus(); initConfig(); initStyle(); initEvents(); } if (document.readyState === 'loading') { var init = function init() { load(); document.removeEventListener('DOMContentLoaded', init); }; document.addEventListener('DOMContentLoaded', init); } else { load(); } })();