我想在右箭头(39)的每个按键上运行以下块:
$(document).ready(function() {
$(document).keydown(function(e) {
var pos = 10;
if (e.keycode = 39) {
if (pos > 10) {
pos + 10;
}
$(".mario").css('left', pos);
}
});
});
目标是我设置一个变量pos
,并以css()
方法引用它以10为增量在屏幕上移动它,每次按下该键时,预期的行为是在每个右箭头键击中,对象以10为增量在屏幕上移动。
它成功运行一次,然后不会继续增加。我的控制台是空的/没有错误。我也尝试过使用keypress
:
$(document).ready(function() {
$(document).keypress(function(e) {
var pos = 10;
if (e.keycode = 39) {
if (pos > 10) {
pos + 10;
}
$(".mario").css('left', pos);
}
});
});
要详细说明这一点,我还想添加一个选项来检查是否按下了左键,如果是,则将其设置为与屏幕齐平。我通过在第一个if语句的结束时添加下面的块来解决这个问题:
else if (e.keycode = 37) {
$(".mario").css('left', '0');
}
我在MDN上进行了研究,它只是说:“按下键时会触发keydown事件。” https://developer.mozilla.org/en-US/docs/Web/Events/keydown
读到那些,我不理解的是为什么我的事件只会被解雇一次?如果每次按下某个键时触发事件,如何为左箭头键添加第二个条件不会注册为事件?
请参阅此处的小提琴:https://jsfiddle.net/c2fr7rsd/1/
编辑/更新:正如许多人指出的那样,我/我正在使用赋值运算符=
而不是比较===
- 我最初尝试比较它不起作用。分配 - 它的工作原理,但现在所有的密钥代码都注册为39!在这种情况下,比较运算符如何不引用键码?
更新#2 - 使用e.which
是处理keydown事件的正确方法,并使用正确的比较===
正常工作
答案 0 :(得分:1)
pos变量应声明为全局。(在函数外部) 现在,每次调用该函数时,变量都会重新设置为10.
检查该变量的逻辑也应该是
if(pos >= 10)
设置变量应为
pos += 10
同时在keyCode中大写C并且==将起作用 https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
这说明了为什么if(e.keycode = 39)的逻辑返回true的原因 https://www.w3schools.com/js/js_mistakes.asp
更正代码示例
$(document).ready(function() {
var pos = 10;
$(document).keypress(function(e) {
if (e.keyCode == 39) {
if (pos >= 10) {
pos += 10;
}
$(".mario").css('left', pos);
}
});
});