在 Vue 中按下斜杠时输入焦点

Focus Input When Pressing Slash in Vue

我看到很多网站都可以通过按斜线键 (Shift + 7) 来聚焦搜索栏或类似内容。 MDN Web Docs 就是一个例子。我想为我的 Vue 应用程序实现它。 Vue 文档提到了最常用键的键修饰符,如 .enter.tab,但没有用于 Slash 的修饰符。此外,由于用户应该能够在页面上的任何位置触发事件,因此不能将事件侦听器应用于输入元素本身。但是,我不知道如何将它应用到整个网站,因为 Vue 应用程序通常被注入到正文中的 div 或类似元素中。

对于像这样的边缘情况,使用常规 javascript 事件侦听器是可以的。

您可以使用 Vue 生命周期方法来添加和删除侦听器。 这是一个工作示例:

Vue.createApp({

  mounted() {
    window.addEventListener("keypress", this.onKeyPress);
  },

  beforeDestroy() {
    window.removeEventListener("keypress", this.onKeyPress);
  },

  methods: {
    onKeyPress(event) {
      if (event.key !== "/") {
        return;
      }

      if (document.activeElement === this.$refs.searchInput) {
        return;
      }

      event.preventDefault();
      this.$refs.searchInput.focus();
    }
  }
}).mount('#app')
input {
  padding: 0.75em 2em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.2.31/vue.global.min.js" integrity="sha512-C/bodwN49fOc1z+jln+2l9FlJ+lZ8HifB30oLE87zMQwsfoWv6Ed25b/x646tlcKb7515VJrJK8uo1oIH1UR2Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<div id="app">
  <input type="search" ref="searchInput" placeholder="Press / to search" />
</div>

另一种解决方案可能是像 v-hotkey 这样的库,它添加了自定义指令。