简体   繁体   English

addEventListener和attachEvent如何工作? Keydown和Keyup不能正常工作

[英]How do addEventListener and attachEvent works? Keydown and Keyup is not working properly

I wrote a code snippet for "shift key" keydown and keyup events for the mozilla but it is not working as I expect. 我为mozilla编写了“ shift key” keydown和keyup事件的代码段,但是它无法正常运行。 Code: 码:

<html>
<head>
<title>Testing Page</title>
<script type="text/javascript">
var key_capslock = 0;
var key_shift = 0;

function print1(){ window.alert("shift status" + key_shift);}
function print2(){ window.alert("shift status" + key_shift);}
function keyset(evt){
  evt.preventDefault();
  if(evt.keyCode == 16){
     if(key_shift == 0 ){key_shift = 1; evt.stopPropagation();}
     else {key_shift = 0; evt.stopPropagation();}
  }
print1();
return;
}
function keyrelease(evt){
   evt.preventDefault();
   if(evt.keyCode == 16){
      if(key_shift == 0 ){key_shift = 1; evt.stopPropagation();}
      else {key_shift = 0; evt.stopPropagation();}
   }
print2();
return;
}

function init(){
document.body.setAttribute("contentEditable", true);
document.body.addEventListener("keydown", keyset, false);
document.body.addEventListener("keyup", keyrelease, false);
}
</script>
</head>
<body onload="init()">
<br>
<body>
</html>

Steps: 1. Press the shift key (keydown and keyup events occur). 步骤:1.按Shift键(发生按键和按键事件)。 2. alert comes with shift status (print1 function runs). 2.警报带有班次状态(运行print1功能)。 I click that. 我点击那个。 Expected: alert should come with shift status (print2 function should run). 预期:警报应带有班次状态(print2功能应运行)。 Actual: print2 function does not run. 实际:print2函数无法运行。

If I press shift key second time then print2 function runs. 如果我第二次按Shift键,则print2功能运行。 I don't understand how the mozilla handling addEventListener function. 我不明白Mozilla如何处理addEventListener函数。 Can someone please help me to resolve this issue? 有人可以帮我解决这个问题吗? I don't want to use any third party framework to resolve this issue (jquery, dojo etc). 我不想使用任何第三方框架来解决此问题(jquery,dojo等)。

Thanks 谢谢

Your code is actually fine, but the alert message takes the focus from the browser, preventing it from detecting keyup . 您的代码实际上很好,但是警报消息将焦点从浏览器keyup ,从而阻止了它检测到keyup

If you change the functions to write to a div, for instance, you will see that both functions work: 例如,如果将函数更改为写入div,您将看到两个函数都可以工作:

http://jsfiddle.net/jtbowden/VqNvG/ http://jsfiddle.net/jtbowden/VqNvG/

Although, I don't understand this code: 虽然,我不明白此代码:

if(key_shift == 0 ){key_shift = 1; evt.stopPropagation();}
 else {key_shift = 0; evt.stopPropagation();}

If you are in keyset , key_shift should always be 1 it seems, rather than toggling: 如果你是在keyset ,key_shift应始终为1看来,而非切换:

function keyset(evt){
  evt.preventDefault();
  if(evt.keyCode == 16){
     key_shift = 1;
     evt.stopPropagation();
  }
  print1();
  return;
}
function keyrelease(evt){
   evt.preventDefault();
   if(evt.keyCode == 16){
      key_shift = 0;
      evt.stopPropagation();
   }
   print2();
   return;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM