Остановить прокрутку страницы при перехвате нажатий клавиш, таких как пробел и стрелки

Я использую JavaScript и Prototype и перехватываю нажатия клавиш пользователем. Я успешно ловлю возврат, пробел и стрелки с помощью такого кода:

Event.observe(window, "keyup", function(e) {
  switch (e.keyCode) {
    case Event.KEY_RETURN:
    case Event.KEY_RIGHT:
    case 32:  // space
      // do something
      break;
  }
});

Моя проблема в том, что пробелы и стрелки продолжают прокручивать страницу. Есть ли способ удержать их от прокрутки страницы?


person pupeno    schedule 02.10.2010    source источник
comment
Как лучше всего уведомить вас с помощью нотации @? @J.Pablo или @JPablo? Любая идея о том, что работает?   -  person brainjam    schedule 02.10.2010
comment
@brainjam Просто скопируйте и вставьте имя пользователя. Я думаю, что на самом деле SO обращает внимание только на первую часть имени до пробела, поэтому @J. должно сработать. Или, комментируя вопрос, как вы, помогает.   -  person JAL    schedule 02.10.2010
comment
@ Алекс, я думаю, что необходимо как минимум 3 символа. См. meta.stackexchange.com/ вопросы/43019/   -  person brainjam    schedule 02.10.2010
comment
Я даже не знал, что SO сделает что-то особенное с @; удивительно!   -  person pupeno    schedule 02.10.2010


Ответы (4)


Из документации по прототипу:

Event.stop(event)
Останавливает распространение события и предотвращает запуск его действия по умолчанию в конечном итоге.

Поэтому добавление Event.stop(e); перед break; должно решить вашу проблему.

Кроме того, вы должны сделать это для события keydown, потому что keyup слишком поздно.

person brainjam    schedule 02.10.2010
comment
Это не сработало ни в Firefor, ни в Chrome. Может я что-то упускаю? - person pupeno; 02.10.2010
comment
@ J.Pablo, я только что понял, что ты наблюдаешь только за событием keyup. Попробуйте наблюдать за событиями keydown и keypress... и использовать там Event.stop(e). В противном случае они, вероятно, доходят до браузера. - person brainjam; 02.10.2010
comment
нажатие клавиши не сработало (оно не имело никакого эффекта, например, если событие не существует), нажатие клавиши сработало, как я и ожидал. Спасибо. - person pupeno; 02.10.2010

Используйте e.preventDefault(), чтобы остановить поведение браузера по умолчанию

person Rahul Talar    schedule 08.10.2012
comment
Не уверен, что применимо в данном случае - person Andrew Barber; 08.10.2012
comment
Эндрю Барбер: да. на практике preventDefault — это все, что вам нужно, и теоретически кажется наиболее правильным решением этой проблемы, поскольку прокрутка браузера — это поведение по умолчанию. - person Jon z; 06.10.2013
comment
Единственное, что у меня сработало (ФФ26). Я использовал его в событии keydown. - person Zdenek; 04.01.2014

В keyup слишком поздно предотвращать действие браузера по умолчанию. Вместо этого сделайте это в событии keydown и используйте метод Prototype Event.stop:

Event.observe(document, "keydown", function(e) {
  switch (e.keyCode) {
    case Event.KEY_RETURN:
    case Event.KEY_RIGHT:
    case 32:  // space
      // do something
      Event.stop(e);
      break;
  }
});
person Tim Down    schedule 02.10.2010
comment
Хорошее понимание того, что keyup слишком поздно в жизненном цикле события. - person Jon z; 06.10.2013

e.preventDefault() работает в Chrome.

person Alex    schedule 06.02.2013