即使我单击输入之外的按钮,如何保持输入焦点

Eme*_*rji 3 javascript focus input onblur

假设我有一个输入

<input type="text" id="inPut" autofocus>
Run Code Online (Sandbox Code Playgroud)

和一个按钮

<button id="btn">Some text</button>
Run Code Online (Sandbox Code Playgroud)

我想要那个 onblur,它会失去焦点(通常会这样),但是当我单击此按钮时,焦点不会发生任何变化,即它不会失去焦点

Som*_*jee 7

您可以使用 JS 将输入集中在按钮单击上。

const btn = document.querySelector("#btn");
const inp = document.querySelector("#inp");

btn.addEventListener("click", () => {
  inp.focus();
});
Run Code Online (Sandbox Code Playgroud)
<input id="inp" type="text">
<button id="btn">Click</button>
Run Code Online (Sandbox Code Playgroud)

如果您不希望输入在尚未聚焦的情况下聚焦在单击上。

为了实现这一目标,我们不能简单地做到:

btn.addEventListener("click", () => {
  if (inp === document.activeElement) {
    inp.focus();
  }
});
Run Code Online (Sandbox Code Playgroud)

因为条件inp === document.activeElement永远不会成立,因为单击按钮将使按钮成为活动元素。

我们可以使用该mouseover事件并将输入的焦点信息存储在变量中,这不会遇到与以前相同的问题,因为mouseover会在按钮获得焦点之前触发。

然后在click侦听器内部,如果输入已经聚焦,我们将聚焦输入。

btn.addEventListener("click", () => {
  if (inp === document.activeElement) {
    inp.focus();
  }
});
Run Code Online (Sandbox Code Playgroud)
const btn = document.querySelector("#btn");
const inp = document.querySelector("#inp");

let isInputFocused = false;

btn.addEventListener("mouseover", () => {
  if (inp === document.activeElement) {
    isInputFocused = true;
  } else {
    isInputFocused = false;
  }
});

btn.addEventListener("click", () => {
  if (isInputFocused) {
    inp.focus()
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 我认为第二个示例在我的手机上不起作用,因为我不希望鼠标悬停事件仅通过单击来触发,但它似乎对我有用。如果有人发现这在触摸设备上不起作用,那么可能可以使用 mousedown 或pointerdown(或两者)事件来代替 mouseover (参考:/sf/ask/513039901/ -get-the-previously-focused-element-in-javascript )。 (3认同)