每个按键都有功能

时间:2017-06-14 20:40:50

标签: javascript jquery

我想在右箭头(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事件的正确方法,并使用正确的比较===正常工作

1 个答案:

答案 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);
    }
    });
});