在按下另一个键之后,移位键被忽略,移位键不好。如何检测何时发布?

时间:2013-07-03 11:52:40

标签: javascript jquery events

我有一个文本输入,当用户按下shift(keydown)并绑定一个监听器以使Shift键上升时,该输入目前是透明的

$('#foo').keydown(function(){
      if(event.which==16){
          //make #foo transparent
          $(this).keyup(function(){
              if(event.which==16){
                 //return #foo to its former glory
                 $(this).unbind('keyup');
              }
          });
       };
  })

当在按下和释放shift键之间没有按下任何字符时,这可以正常工作。问题是,当换档失败并且按下另一个角色时,换档键似乎已被完全遗忘。当释放shift键时,没有键盘触发。

我试图在.which属性设置为16的情况下触发'假'keydown,在按下其他字符后向右移动,但无效。

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:1)

在按 shift 的同时,它将持续触发keydown个事件,直到您释放它为止,因此您的示例将绑定与keyup一样多的keydown个处理程序触发事件。这很可能会引发各种奇怪的问题。

相反,将keydownkeyup绑定到同一个处理程序并在那里做你的魔术:

$("#foo").on("keydown keyup", function (e) {
    if (e.which === 16) {
        if (e.type === "keydown") {
            // make #foo transparent
        } else {
            // return #foo to its former glory
        }
    }
});

请参阅test case on jsFiddle

但是,如果在按 shift 然后释放时失去输入焦点,则无法按预期工作。解决此问题的一种方法是绑定到window

var $foo = $("#foo");
var shiftPressed = false;

$(window).on("keydown keyup", function (e) {
    if (e.which === 16) {
        shiftPressed = e.type === "keydown";
        if (shiftPressed && e.target === $foo[0]) {
            $foo.addClass("transparent");
        } else {
            $foo.removeClass("transparent");
        }
    }
});

$foo.on("focus blur", function (e) {
    if (e.type === "focus" && shiftPressed) {
        $foo.addClass("transparent");
    } else {
        $foo.removeClass("transparent");
    }
});

请参阅test case on jsFiddle