我不是一个很好的程序员,我设法把一个DoS程序移植到Windows上,然后从Windows到Java脚本运行,从2014年开始就是一个浏览器.我有一些Keydown事件监听程序,它们在启动时基于Preferences.js文件运行.如果可能的话,我想添加禁用和启用按钮来关闭和打开监听程序(我知道劫持Ctrl和Shift对一些人来说可能是有问题的)

if (usectrlshiftdnup) {

 // Trying to get Shift key 16 to step up a graph data set which works

 document.addEventListener('keydown', function (event) {
   if (event.keyCode === 16) {

     document.activeElement.blur();
     document.getElementById("upbutton").click(); 
     document.activeElement.blur();

   }
 });

 // Trying to get Ctrl key 17  to step down a graph data set which works

 document.addEventListener('keydown', function (event) {
   if (event.keyCode === 17) {

     document.activeElement.blur();
     document.getElementById("dnbutton").click(); 
     document.activeElement.blur();

   }
 });

我通常是一个反复try 的程序员,我读过一些关于emoveEvenListener的文章,但我想这次我会直接问一下.

推荐答案

您可以引入一个抽象层来管理当前活动的监听器回调.大概是ListenerManager分.

class ListenerManager {
    listeners = [];

    storeListener(typeString, callback) {
        this.listeners.push([typeString, callback]);
        // Note that this function also automatically "enables" the stored listener
        document.addEventListener(typeString, callback);
    }

    enableListeners() {
        this.listeners.forEach((listener) => document.addEventListener(listener[0], listener[1]));
    }

    disableListeners() {
        this.listeners.forEach((listener) => document.removeEventListener(listener[0], listener[1]));
    }
}

您可以这样使用它:

let manager = new ListenerManager();
manager.storeListener("keydown", myCallback1);
manager.storeListener("keydown", myCallback2);

// Let's say you want to disable them all
manager.disableListeners();

// Later you want to enable them all again
manager.enableListeners();

或者,您可以在更高的级别上执行此操作,虽然效率较低,但可能会更简单.只需使用一个全局布尔变量,所有相关的回调都会手动判断该变量,以确定它们是否应该忽略输入.

let isEventsDisabled = false;

// Your callbacks would look something like:
function myCallback1(event) {
    // Guard clauses
    if (isEventsDisabled) return; // Relevant callbacks have this added for "disabling"
    if (event.keyCode !== 16) return;

    document.activeElement.blur();
    document.getElementById("upbutton").click(); 
    document.activeElement.blur();
}

// And you would register listeners "directly" the same way you have been doing
document.addEventListener("keydown", myCallback1);

// Let's say you want to disable them all
isEventsDisabled = true;

// Later you want to enable them all again
isEventsDisabled = false;

Javascript相关问答推荐

不渲染具有HTML参数的React元素

如何在JavaScript中在文本内容中添加新行

我试图实现用户验证的reduxstore 和操作中出了什么问题?

格式值未保存在redux持久切片中

调用removeEvents不起作用

WebRTC关闭navigator. getUserMedia正确

我们如何从一个行动中分派行动

在拖放时阻止文件打开

如何在 cypress 中使用静态嵌套循环

为什么Mutations 观察器用微任务队列而不是macrotask队列处理?

变量的值在Reaction组件中的Try-Catch语句之外丢失

更改预请求脚本中重用的JSON主体变量- Postman

Webpack在导入前混淆文件名

根据一个条件,如何从处理过的数组中移除一项并将其移动到另一个数组?

Reaction组件在本应被设置隐藏时仍显示

用另一个带有类名的div包装元素

JavaScript -复制到剪贴板在Windows计算机上无效

如何在尚未创建的鼠标悬停事件上访问和着色div?

使用createBrowserRoutVS BrowserRouter的Reaction路由

将以前缓存的 Select 器与querySelector()一起使用