Как работают addEventListener и attachEvent? Keydown и Keyup не работают должным образом - PullRequest
1 голос
/ 25 января 2011

Я написал фрагмент кода для событий keydown и keyup shift для Mozilla, но он не работает, как я ожидал.Код:

<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>

Шаги: 1. Нажмите клавишу Shift (происходят нажатия клавиш и нажатия клавиш).2. предупреждение приходит с состоянием смены (работает функция print1).Я нажимаю на это.Ожидаемый: оповещение должно прийти с состоянием смены (должна работать функция print2).Факт: функция print2 не запускается.

Если я нажму клавишу Shift второй раз, то функция print2 запустится.Я не понимаю, как mozilla обрабатывает функцию addEventListener.Может кто-нибудь, пожалуйста, помогите мне решить эту проблему?Я не хочу использовать сторонние фреймворки для решения этой проблемы (jquery, dojo и т. Д.).

Спасибо

1 Ответ

3 голосов
/ 25 января 2011

Ваш код на самом деле в порядке, но предупреждающее сообщение фокусируется на браузере, не давая ему обнаружить keyup.

Если вы измените функции для записи в div, например, вы увидите, что обе функции работают:

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

Хотя я не понимаю этот код:

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

Если вы находитесь в 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;
}
...