javascript - Vanilla JavaScript : Disabling a given preexisting key-combo in a webpage

标签 javascript jquery html return keyboard-shortcuts

在此随机English-Wikipedia edit page可以添加一些内容(比如“测试”),然后通过 Alt+Shift+S 的预先存在的组合键保存它。

我希望特别地防止这种行为(无需使用 document.querySelector("#wpSave").remove(); 删除保存按钮)。

我尝试了以下失败的代码:

// ==UserScript==
// @name         wiki
// @match        https://*.wikipedia.org/*
// ==/UserScript==

document.addEventListener("DOMContentLoaded", ()=>{
    document.addEventListener('keypress', function(e) {
        if (e.key == 16 && e.key == 18 && e.key == 83) {
            return false;
        }
    });
});

我还尝试用 e.preventDefault()evt.stopPropagation() 替换 return false,但都失败了(没有控制台错误).

代码有什么问题?


注意:这个问题不同于this one通过专注于一般地禁用给定的预先存在的组合键功能,而不是一般地保存功能


dotoconor 更新

我在控制台中使用了它,但我仍然遇到同样的问题:

document.addEventListener("DOMContentLoaded", ()=>{
    const state = {};
    document.addEventListener('keydown', function(e) {
        state[e.key] = true;
    });

    document.addEventListener('keyup', function(e) {
        state[e.key] = false;
    });

    document.addEventListener('keyup', function(e) {
        state[e.key] = false;
        if (state["Alt"] && state["Shift"] && (state["S"] || state["s"])) {
            return e.preventDefault();
        }
    });
});

最佳答案

一次只会出现一个按键事件,因此您必须创建一个状态机来确定哪些是打开的,哪些是关闭的。 考虑一下:

const state = {};
document.addEventListener('keydown', function(e) {
  state[e.key] = true;
});


document.addEventListener('keyup', function(e) {
  state[e.key] = false;
});

现在有了这个,您可以检查您想要的键是否一次都被按下,然后防止最后一次按键向下滴入 DOM。

document.addEventListener('keyup', function(e) {
  state[e.key] = false;
  if (state["Alt"] && state["Shift"] && (state["S"] || state["s"])) {
    return e.preventDefault();
  }
});

关于javascript - Vanilla JavaScript : Disabling a given preexisting key-combo in a webpage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52924807/

相关文章:

javascript - ajax 无效 json,为什么这是无效的 JSON?

javascript d3 可视化在单击 HTML 输入之前不会加载/显示

javascript - 在代码示例中无法理解 this 的上下文

javascript - 跨域脚本标签适用于 FF 和 Chrome,但不适用于 IE

javascript - 如何从 Javascript 对象中删除函数名称

javascript - 如何对选择列表中的选项进行排序但将一个选项保留在顶部

javascript - Bookmarklet 打开一个空的选项卡/窗口,里面有一些 javascript?

javascript - Jquery 隐藏/显示加载更多按钮

PHP 从 AJAX 图像 uploader 获取隐藏变量

php - 读取由 PHP 生成的包含 @attributes 的 JSON(使用 jQuery)