Требуется помощь по отладке: запретить возврат назад

У меня есть веб-приложение, которое использует клавишу возврата для своих целей. У меня уже давно есть следующая функция, вызываемая document.keyup, которая годами работала без проблем:

function keyupKeys (evt) {
  if(this.activeElement.id == 'q') return true; //ignore input to the search box
  if(!evt) var evt = window.event;
  var code = evt.keyCode;

  //handle special keys:
  switch(code) {
    case  9: // tab
    case 39: // right arrow
      press('colon'); break;
    case 37: // left arrow
      press('colon');
      press('colon'); break;
    case 13: // enter
      press('eq'); break;
    case  8: // backspace
      press('bs'); break;
    case 46: // delete
    case 144:// numpad clear
      press('c'); break;
    case 27: // esc
      press('ac'); break;
    default: // Not a key this function handles
      return true;
  }
  return false;
};

Недавно я обнаружил, что Chrome в Windows и Chromium в Linux начали возвращаться назад при нажатии клавиши Backspace. Раньше такого не было. Мне еще предстоит протестировать другие браузеры.

Связанные вопросы по SO заставили меня изменить случай возврата таким образом:

case  8: // backspace
  if(evt.preventDefault) evt.preventDefault();
  press('bs'); break;

Однако это изменение не имело никакого эффекта. Кроме того, поскольку браузер возвращается назад, я не могу использовать какие-либо инструменты отладки в консоли Javascript, поэтому я понятия не имею, что происходит.

Может ли кто-нибудь объяснить, что происходит, и предложить способ исправить это?


person Scott Severance    schedule 15.08.2015    source источник
comment
В какой версии Chrome вы видите проблему? Ваше веб-приложение, кажется, работает для меня с возвратом на место.   -  person Maximillian Laumeister    schedule 16.08.2015
comment
@MaximillianLaumeister: сейчас я использую Chromium версии 43.0.2357.130 Ubuntu 14.04. Я впервые обнаружил проблему ранее на этой неделе на своем рабочем компьютере с Windows 7. Я не знаю версию Chrome, но она настроена на автоматическое обновление.   -  person Scott Severance    schedule 16.08.2015
comment
единственный способ, который я знаю для этого, - это выбрать что-то на странице и убедиться, что при загрузке страницы у него есть focus, текстовое поле отлично работает. иначе не забирай мой backspace   -  person WhiteHat    schedule 16.08.2015
comment
Интересно. Моя версия Chrome — 44.0.2403.155 (64-разрядная версия), для справки.   -  person Maximillian Laumeister    schedule 16.08.2015
comment
Не var evt — просто используйте evt, объявленный вами в аргументах функции!   -  person metadings    schedule 16.08.2015
comment
Возможный дубликат Предотвратить возврат BACKSPACE с помощью jQuery (например, главная страница Google)   -  person Michał Perłakowski    schedule 22.01.2016


Ответы (2)


Вы должны слушать keydown, а не keyup событие.

person Michał Perłakowski    schedule 15.08.2015

Чтение этот ответ заставило меня подумать, что проблема может быть вызвана вызовом моей функции при нажатии клавиши, а не при нажатии клавиши. Я отчетливо помню, что когда я впервые написал этот код давным-давно, я использовал keyup для решения какой-то проблемы; что это было я уже не помню. Во всяком случае, я создал следующую функцию, которая будет называться onkeydown. Кажется, проблема решена.

function keydownKeys(evt) {
  if(this.activeElement.id == 'q') return true; //ignore input to the search box
  if(!evt) var evt = window.event;
  var code = evt.keyCode;
  if(code == 8) {
    if(evt.preventDefault) {
      evt.preventDefault(); //kill backspace triggering back button
    }
    return false;
  }
  return true;
}
person Scott Severance    schedule 15.08.2015