在contextmenu事件之后未注册Keyup事件

时间:2013-03-10 10:11:41

标签: javascript jquery contextmenu keydown keyup

我正在尝试以下代码。每当按下sh键时,它应该将输入的shift属性更改为1,并在释放时恢复为0

<!DOCTYPE html>
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">
</script>
<script>
$(document).ready(function(){
 $(document).on("keyup","body",function(e) {
   if (e.which == 16) {
     $("input").attr("sh","0");
   }
 });

$(document).on("keydown","body",function(e) {
  if (e.which == 16) {
     $("input").attr("sh","1");
   }
 });
});
</script>
</head>
<body>
<input type = 'text' sh = '0'/>
<p>Just checking</p>
</body>
</html>

除非执行此事件序列,否则它可以正常工作。输入未对焦时按shift键。 (Firebug显示sh变为1,如预期的那样)。现在按键仍然按下,关注输入。现在右键单击输入。弹出上下文菜单。现在,如果您释放shift密钥(让上下文菜单保留),Firebug会显示sh仍为1.您在上下文菜单外单击以使其继续,甚至单击paste选项要将剪贴板文字粘贴到输入中,仍然sh仍为1.如果您再次按下并释放shift,则只有sh再次变为0。

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

以下内容对您有帮助吗? 我不确定我是否正确地模拟了你的场景,但似乎对我有用。我在Chrome中测试过。

$(document).ready(function(){

$(document).keyup(function (e) {
    if (e.which == 16) {
        $("input").attr("sh", "0");
        console.log($("input").attr("sh"));
    }
});

$(document).keydown(function (e) {
    if (e.which == 16) {
        $("input").attr("sh", "1");
        console.log($("input").attr("sh"));
    }
});

//Works... (holding shift will raise keydown as much as I hold the key...)
//$(document).keyup(function (e) {
//    if (e.keyCode == 16) {
//        console.log("Shift was released...");
//    }
//});

//$(document).keydown(function (e) {
//    if (e.keyCode == 16) {
//        console.log("Shift was pressed down...");
//    }
//});

});