Отключить клавиши со стрелками от прокрутки, только когда пользователь взаимодействует с <canvas> - PullRequest
3 голосов
/ 30 сентября 2011

Я добавил прослушиватель событий в JS для прослушивания событий keyup / keydown, я пытаюсь переместить спрайт по холсту HTML.У меня это в основном работает, но страница прокручивается, когда пользователь нажимает клавиши со стрелками.

Я возвращаю false, и это не похоже на работу.Кроме того, я понимаю, что возвращение false таким образом отключило бы прокрутку кнопок со стрелками для всей страницы.Я хотел бы отключить это, только когда пользователь взаимодействует с самим холстом.

Вот мой слушатель событий:

addEventListener('keydown', function(e){
    move = false;
    x = false;
    y = false;
    var keycode;
    if (window.event) keycode = window.event.keyCode;
    else if (e) keycode = e.which;
    switch(keycode){
        case 37:
            move = true;
            x = 'negative';
        break;
        case 38:
            move = true;
            y = 'negative'
        break;
        case 39:
            move = true;
            x = 'positive'
        break;
        case 40:
            move = true;
            y = 'positive'
        break;
    }
    if(move){
        animation.move(x,y);
    }
    return false;
})

Редактировать:

Ответ ниже дает хорошее представление о том, как убедиться, что холст сфокусирован, но я все еще озадачен, почему возвращение false в моей функции EventListener, которая возвращает false, не отключает прокрутку.

Ответы [ 3 ]

11 голосов
/ 30 сентября 2011

Пока вы как-то фокусируете свой холст (то есть canvas.tabIndex = 1;), вы можете просто добавить e.preventDefault() прямо перед return false, и оно будет работать.

Пример:

http://jsfiddle.net/faAkN/

1 голос
/ 15 декабря 2012

У меня была похожая проблема, и я нашел исправление.

Вот что я придумал:

function $(){
  return document.querySelector.apply(document,arguments);
}
var canvas = $('canvas'),
    keysDown = []; // You can also define this as an object, {}
canvas.tabIndex = 0;
canvas.onclick = function(e){
  document.body.scrollTop = canvas.offsetTop; // scrolls to canvas element
  canvas.focus(); // re-focuses canvas in case the scroll unfocused it
}
canvas.onkeydown = canvas.onkeyup = function(e){
  keysDown[e.keyCode] = e.type == 'keydown';
  e.preventDefault();
  return false;
}
function isDown(key){
  return keysDown[key];
}
function resetMap(){
  keysDown = [];
  return false;
}

Чтобы проверить, нажата ли клавиша, используйте isDown(keycode) либо в интервальном цикле, либо в функции нажатия клавиши.

Для обычного ключевого слушателя:

canvas.onkeydown = canvas.onkeyup = function(e){
  // [...]
  if(isDown(17) && isDown(32)){ // Ctrl + Space
    alert('Ctrl and Space were pressed');
    resetMap();
  }
  e.preventDefault();
  return false;
}

Для быстрого слушателя клавиш, похожего на ActionScript 2.0 Key.isDown

function KeyLoop(){
  if(isDown(17) && isDown(32)){ // Ctrl + Space
    console.log('Lots of text');
    resetMap();
  }
  setTimeout(keyLoop,1000/24); // @ 24 fps
}
keyLoop();

Я поместил другое действие здесь по двум причинам: 1) Смешивание alert() с повторяющимся интервалом никогда не является хорошей идеей, и 2) продемонстрировать отсутствие задержки, что делает его похожим на AS2 Key.isDown() функция. Чтобы увидеть зарегистрированный текст, вызовите firebug или обычную консоль JavaScript. В Chrome это Ctrl Shift J . В Firefox Ctrl Shift K .


Это должно исправить вашу проблему с прокруткой, сосредоточившись на элементе, когда вы щелкаете по холсту. Дополнительным преимуществом является то, что вы можете проверять сразу несколько ключей, поскольку вы используете keysDown[] в качестве абстракции от исходного события, что упрощает создание игры с 8 направлениями.

0 голосов
/ 30 сентября 2011

Вы пробовали что-то подобное?

<script type="text/javascript">
    canvas_active = false;
</script>

<canvas onfocus="javascript: canvas_active = true;" onblur="javascript: canvas_active = false;" />

Затем в текущем методе проверьте, является ли canvas_active истинным, и если да, верните ложное, иначе верните истинное.Конечно, это будет работать, только если холст сфокусирован все время, пока он перемещается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...