Vanilla JavaScript: отключение заданного существующего сочетания клавиш на веб-странице - PullRequest
0 голосов
/ 22 октября 2018

На этой случайной странице редактирования англо-википедии можно добавить некоторый контент (скажем, "тест"), а затем сохранить его с помощью существующей комбинации клавиш 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;
        }
    });
});

Я также пытался заменить return false на e.preventDefault() или evt.stopPropagation(), но все не удалось (без ошибок консоли).

Что не так с кодом?


Примечание: Этот вопрос отличается от от этого тем, что в нем основное внимание уделяется отключению заданной ранее существующей комбинации клавиш, а не сохранению функций вобщее.


Обновление для 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();
        }
    });
});

1 Ответ

0 голосов
/ 22 октября 2018

Одновременно будет присутствовать только одно ключевое событие, поэтому вам нужно создать конечный автомат, чтобы определить, какие из них включены и выключены.Подумайте об этом:

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();
  }
});
...