如何存储prompt输入的按键并实现Tampermonkey自定义快捷登出脚本?
自定义按键登出油猴脚本修复方案
原代码核心问题
- 变量类型不匹配:
prompt()返回的是字符串类型的按键字符,原代码用数字类型的event.keyCode做相等判断,永远无法触发条件 - 无效API调用:
<button>元素没有submit()方法,该方法仅属于表单元素,调用会抛出错误阻塞代码运行 - 作用域问题:油猴运行在独立沙箱中,直接调用页面定义的
logout()函数会报未定义错误,需要通过unsafeWindow访问页面全局作用域 - 执行时机错误:如果脚本在DOM渲染完成前运行,
document.getElementById("logoutButton")会返回null,后续操作全部失效 - 逻辑冗余:按键触发后同时执行点击、调用登出函数,重复操作容易引发异常
完整可用代码
// ==UserScript== // @name 自定义快捷键登出 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 按下预设按键快速登出网站 // @match *://你的目标网站域名/* (请替换为实际要适配的网站规则) // @grant unsafeWindow // @run-at document-end // ==/UserScript== (function () { 'use strict'; // 等待DOM完全加载 document.addEventListener('DOMContentLoaded', () => { // 获取用户设置的触发按键 const triggerKey = prompt('请输入任意按键作为登出快捷键'); // 用户点击取消则终止脚本执行 if (!triggerKey) return; // 统一转小写避免大小写敏感 const matchKey = triggerKey.toLowerCase(); // 获取登出按钮元素 const logoutBtn = document.getElementById('logoutButton'); // 监听全局按键事件 document.addEventListener('keydown', (e) => { if (e.key.toLowerCase() === matchKey) { // 方案1:模拟点击登出按钮(优先使用,复用页面原有逻辑) if (logoutBtn && logoutBtn.style.display !== 'none') { logoutBtn.click(); } // 方案2:直接调用页面登出函数,不需要模拟点击的话开启这个,注释方案1即可 // if (typeof unsafeWindow.logout === 'function') { // unsafeWindow.logout(); // } } }); }); })();
使用注意事项
- 必须替换脚本头中
@match字段的域名规则为你要适配的网站,否则脚本不会生效 - 如果选择使用方案2直接调用登出函数,
@grant unsafeWindow配置不能删除 - 脚本默认不区分按键大小写,如需区分可以删除代码中两处
.toLowerCase()调用
内容的提问来源于stack exchange,提问作者LightLord
相关产品推荐
相关产品推荐

