输入焦点时阻止事件侦听器

Prevent evenListener when input is in focus

我在脚本中设置了一些键绑定,但是当我关注输入字段时,我不希望它们触发。我已经尝试过 removeEventListener() 但无法完全按照我想要的方式工作。

document.addEventListener("keydown", (e) => {
  if (e.code == "Enter") {
    e.preventDefault();
    toggleHiddenElements();
  }
  else if (e.code == "KeyA") {
    toggleScene("vorspann");
  }
  else if (e.code == "KeyE") {
    toggleScene("abspann");
  }
  else if (e.code == "KeyL") {
    loadSetup();
  }
  else if (e.code == "KeyR") {
    resetUI();
  }
});

这是输入字段之一,例如:

<input type="text" id="vorspann-thema" placeholder="Enter a title">

最简单的解决方案是使用您通常不需要的绑定,例如 F 键,但遗憾的是它们必须是 A、E、L、R 和 Enter。

以下建议无效:

var speakerfocus = false;

function getfocus(e) {
  speakerfocus = true;
  console.log(speakerfocus);
}

document.getElementById("speakers-schmal").addEventListener("click", getfocus);

document.addEventListener('click', removefocus);

function removefocus(e) {
  if (e.target != document.getElementById("bauchbinde-schmal")) {
    speakerfocus = false;
    console.log(speakerfocus);
    return;
  }
};

使用布尔标志来确定输入是否处于焦点。给input添加一个点击事件监听器,如果flag为true,则改为false,否则改为true。然后你可以在你的键绑定中使用 if 语句。

let focus = false;
document.getElementById('vorspann-thema').addEventListener('click', () => {
focus = true;
});
document.addEventListener('click', (e) => {
if (e.target != document.getElementById('vorspann-thema') focus = false;
});

在 expressjs123 的帮助下,我最终找到了解决问题的方法。

为了让代码适用于我所有的输入标签,我必须使用 getElementsByTagName 它创建了我所有输入标签的列表,然后我用 for-循环。

为“点击”设置一个 eventListener,使焦点等于 true,为 'blur' 设置一个 eventListener,因此离开时焦点等于 false输入字段。

可以在此处查看示例!

let focus = false;
let inputList = document.querySelectorAll("input[type=text]");
for (let i = 0; i < inputList.length; i++) {
  inputList[i].addEventListener('click', () => {
    focus = true;
  })
  inputList[i].addEventListener('blur', () => {
    focus = false;
  })
}

document.addEventListener("keydown", (e) => {
  if (focus == false) {
    if (e.code == "KeyR") {
      redBGcolor();
    } else if (e.code == "KeyG") {
      greenBGcolor();
    }
  }
})

function redBGcolor() {
  document.getElementById("bod").classList.add('red');
  document.getElementById("bod").classList.remove('green');
}

function greenBGcolor() {
  document.getElementById("bod").classList.add('green');
  document.getElementById("bod").classList.remove('red');
}
.red {
  background-color: red;
}

.green {
  background-color: green;
}

input {
  margin-top: 5px;
}
<body id='bod'>

  <input type="text" id="fname"><br>
  <input type="text" id="lname"><br>
  <input type="text" id="mname"><br>
  <input type="text" id="tname"><br>

</body>