【问题标题】:Enter with @keyup event not working in Vue使用 @keyup 事件输入在 Vue 中不起作用
【发布时间】:2018-04-07 21:14:18
【问题描述】:

我试图在按下回车键时调用方法,但它不起作用。代码如下。

<template>
  <div>
    <button @click="callEvent" @keyup.enter="callEvent"> Click </button>
  </div>
</template>

<script>
export default{
  methods:{
    callEvent(){
      console.log("Event called");
    }
  }
}
</script>

【问题讨论】:

  • 我不确定@keyup.enter 在按钮上是否有效,因为按钮没有keyup 事件。它应该用于输入
  • 确实callEvent被keyup事件触发的意义上起作用。 jsfiddle.net/12um7eeb 实际问题是什么?正如其他人提到的,Enter键的keydown事件会触发click事件。因此,当您按 Enter 时,该方法会触发两次。一次在 keydown 上,一次在 keyup 上。你想防止这种情况发生吗?
  • @thanksd,Enter 键事件被触发,但我在 app.callEvent() 上遇到错误;
  • 您提供的代码可以正常工作并且没有错误,请参阅我的小提琴。您需要提供更好的上下文。

标签: javascript vue.js


【解决方案1】:

click 事件已经通过 ENTER 键触发(在某些浏览器中,它也会通过 Space 触发,例如桌面版 Chrome)。因此,您的代码只需要 @click="callEvent" 并且一切正常,因为焦点已经在按钮上:

var app = new Vue({
  el: "#app",
  methods: {
    callEvent() {
      console.log("Event called");
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.2/vue.min.js"></script>
<div id="app">
  <button @click="callEvent">Enter</button>
</div>

如果您希望任何 ENTER 触发按钮,即使它没有焦点,您应该将事件绑定到 window 对象,该对象可以在 mounted 处理程序中进行:

var app = new Vue({
  el: "#app",
  methods: {
    callEvent() {
      console.log("Event called");
    }
  },
  mounted() {
    window.addEventListener('keyup', function(event) {
      if (event.keyCode === 13) { 
        app.callEvent();
      }
    });
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.2/vue.min.js"></script>
<div id="app">
  <button>Enter</button>
</div>

请记住,如果您使用的是单文件组件,该实例由 this 关键字公开,可用于调用所需处理程序内的组件方法:

export default {
  methods: {
    callEvent() {
      console.log('Event called')
    }
  },
  mounted() {
    window.addEventListener('keyup', event => {
      if (event.keyCode === 13) { 
        this.callEvent()
      }
    })
  }
}

【讨论】:

  • 我正在使用 vue 路由器,所以出现错误“未捕获的 ReferenceError:应用程序未定义”
  • 在我的示例中,app 是 Vue 实例。由于您使用的是单文件组件,因此每个组件实例都使用this 关键字:this.callEvent() 公开。我已经更新了可能会回答以澄清这一点。
  • this 引用 Vue 实例并不特定于单文件组件。您可以在第二个示例中执行相同的操作。
  • @thanksd,我相信this的含义超出了这类问题的范围。是的,我可以在第二个示例中使用它以及一个 箭头函数,我没有使用它,因为它是由浏览器运行的代码 sn-p,而 IE 不理解它。使用单文件组件,我们可以放心使用它。
  • 我同意。我认为您的最后一个示例超出了范围且具有误导性。旁注:你可以在你的代码 sn-p 中启用 Babel,这样箭头函数就可以在 IE 中运行了。
【解决方案2】:

在使用带有 window.addEventListener 的原生 JS 时,我遇到了不一致的结果。 VueJS 原生支持修改键盘事件的行为https://vuejs.org/v2/guide/events.html#Key-Modifiers

由于 Tab 键需要单独的行为,这在我的情况下也工作得更好。

你的输入可以看起来像这样,每个键上都有自定义修饰符

    <input 
        type="text" 
        class="form-control" 
        placeholder="Start typing to search..." 
        v-model="search_text" 
        @focus="searchFocus" 
        @blur="searchFocusOut"
        v-on:keyup.enter="nextItem"
        v-on:keyup.arrow-down="nextItem"
        v-on:keyup.arrow-up="nextItem"
        v-on:keydown.tab="nextItem"
    >

然后在 NextItem 中,您可以引用该事件,并获取每个键.. 或为每个键修饰符编写一个单独的函数。

【讨论】:

    【解决方案3】:

    按钮上没有 keyup 事件。即使您将注意力集中在按钮上并按 Enter 键,它也会被视为单击事件,而不是 keyup.enter

    尝试将事件绑定到输入,它会起作用。

    或者,您可以使用 jQuery(或普通 JS)绑定 body 元素上的 keydown 事件,并通过调用 app.callEvent() 触发 Vue 方法。

    var app = new Vue({
      el: "#app",
      methods: {
        callEvent() {
          console.log("Event called");
        }
      },
      mounted() {
        var self = this;
        window.addEventListener('keyup', function(event) {
          if (event.keyCode === 13) { 
            self.callEvent();
          }
        });
      }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.2/vue.min.js"></script>
    <div id="app">
      <template>
      <div>
        <button @click="callEvent"> Click </button>
      </div>
      <input type="text"  @keyup.enter="callEvent" />
    </template>
    
    </div>

    更新为使用 mounted 而不是依赖 jQuery - 如 per Erick Petrucelli's answer,因为它允许在没有全局变量的情况下引用 Vue 组件。

    【讨论】:

    • 还有其他解决方案吗?我有一个没有输入的页面,如果用户点击输入它应该调用方法。
    • 检测回车按键事件和调用方法之类的?
    • 如果用户将注意力集中在按钮上,那么就没有问题 - 因为它无论如何都会触发点击事件。否则,您可以尝试使用 jQuery 绑定到 body 元素,并通过从 jQuery 事件监听器调用 app.callEvent() 来触发 Vue 方法。你想让我在答案中表明这一点吗?
    • @Hitendra 更新了答案。
    • 查看更新后的代码。 出现错误 Uncaught ReferenceError: app is not defined
    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多