如何在不使用input元素的情况下捕获Vuejs中的任何按键事件
How to capture any keypress event in Vuejs without using input element
我正在制作一款游戏,我想让用户输入一个特定的单词,然后我想检查这个特定的单词是否被按下了。如果按了这个词,我就取下一个词。目前我正在使用的形式,并已使用v-model如下所示:
<input v-model="inputSpell">
在Vue实例中,我使用了watch属性,它不断检查输入的单词是否与请求的单词匹配。
watch : {
inputSpell : function() {
var spellCount = this.spellCount;
var inputSpell = this.inputSpell.toUpperCase();
var presentSpell = this.presentSpell;
console.log("Spell Count " + spellCount);
console.log("Input Spell " + inputSpell);
console.log("Present Spell" + presentSpell);
if (inputSpell.length === 3 && inputSpell === presentSpell) {
this.$set(this, 'inputSpell', '');
if (spellCount === 3) {
return this.completeCombo();
}
return this.fetchSpell(spellCount);
}
if (inputSpell.length >=3) {
this.$set(this, 'inputSpell', '');
}
}
}
我想到了三个主意:
上面我所做的是显示表单。用户在该表单中输入单词。看起来不太好。
将输入元素隐藏并在游戏加载时聚焦于它。但缺点是,如果用户单击页面上的任何地方,窗体的焦点就会丢失。
创建一个自定义指令或调用一个方法来捕获按键事件以检查单词。
任何帮助将不胜感激。
谢谢。
要在不使用输入的情况下捕获按键,您可以在生命周期钩子(例如"mounted")中包含一个标准事件侦听器,如下所示:
mounted() {
let self = this;
window.addEventListener('keyup', function(ev) {
self.myMethod(ev); // declared in your component methods
});
}
很可能,您希望在创建组件时添加事件侦听器,并在组件销毁时删除它。否则,如果在会话中多次加载组件,将会有多个重复的事件侦听器响应单个事件。
methods: {
keyDownHandler(e) {
console.log(e.key)
// Your handler code here
},
},
created() {
window.addEventListener('keydown', this.keyDownHandler)
},
destroyed() {
window.removeEventListener('keydown', this.keyDownHandler)
},
完成Stephen Lake的注释,你可以直接在输入标签
上使用v-on指令<input v-model="inputSpell" v-on.keyup="inputSpell">
or
<input v-model="inputSpell" @keyup="inputSpell">
inputSpell : function(event) {
let value = event.target.value
var spellCount = this.spellCount;
var inputSpell = value.toUpperCase();
var presentSpell = this.presentSpell;
console.log("Spell Count " + spellCount);
console.log("Input Spell " + inputSpell);
console.log("Present Spell" + presentSpell);
if (inputSpell.length === 3 && inputSpell === presentSpell) {
this.$set(this, 'inputSpell', '');
if (spellCount === 3) {
return this.completeCombo();
}
return this.fetchSpell(spellCount);
}
if (inputSpell.length >=3) {
this.$set(this, 'inputSpell', '');
}
}
请注意,从用户的角度来看,自动更改输入值并不能提供最佳体验(我个人认为这非常令人沮丧)。
相关文章:
- 如何查明鼠标按下事件是否发生在滚动条上或元素中的其他任何位置
- 是否有任何条件仅在 javascript 中按下浏览器关闭 (x) 时检测
- 如何通过按 id 注册但未在任何 DOM 节点中引用来删除 dojo 小部件
- 在按 TAB 键时,文本字段中没有任何数据,它应该显示所需的字段验证 ASP.NET
- 在页面完成加载后立即使用 jQuery 创建一个弹出窗口,而无需按下任何按钮
- 鼠标在全屏+指针锁定状态下按下任何键时都不会启动
- 如何在不按任何键的情况下通过Jquery调用按键事件
- 按绝对值旋转画布绘图上下文的任何方法
- 为什么不'当我按下任何按钮时,这个Javascript代码都能工作并生成一个介于1和3之间的数字
- 是否有任何方法可以检测用户是否按下“按钮”;停留在页面上”;或“;离开页面"在beforeunload事件中
- 当通过引用而不是按值复制 JavaScript 值时,是否有任何经验法则
- 有没有任何方法可以在Javascript中按类获取数组中的输入值
- 拦截删除按钮按下-在确认中取消不会起任何作用
- 当按下Submit时,Form不会执行任何操作
- 这里我有一个HTML表单和PHP MySQL表,在表中输入值并按下提交按钮后,不会出现任何输出
- Vuejs$remove按日期分组的数据
- 当您将窗口调整为任何大小时,如何按比例获得此缩放框的图像和文本
- 如何在不使用input元素的情况下捕获Vuejs中的任何按键事件
- 我如何检测如果CAPS LOCK状态是活跃的,不按任何键使用JS
- 尝试按字母顺序排列jQuery UI accordion;可以在任何地方工作,但IE除外