Firefox autocomplete 'enter' keypress при запуске автозаполнения введите в текстовое поле

У меня есть форма с некоторыми обычными полями, например "электронная почта". У меня есть javascript, который ловит ключ возврата (13) и отправляет форму, но тот же эффект наблюдался при использовании свойства defaultButton на панели хоста.

Если пользователь находится в IE и набирает свой адрес электронной почты, затем выбирает элемент из встроенного автозаполнения браузера, нажимая ENTER, в Javascript не поступает нажатие клавиши. ХОРОШО.

В Firefox однако текстовое поле получает нажатие клавиши ENTER и хочет отправить форму, которая не завершена.

Кто-нибудь знает, как остановить это, кроме как отключить автозаполнение? Я не могу найти способ обнаружить, что нажатие клавиши действительно происходит из автоматического полного списка.

Я использую asp.net и jQuery.

Изменить - уточнить: При нажатии на элемент в автозаполнении НЕ следует отправить форму. Поведение IE правильное (на один раз!).

Мой обработчик событий сам по себе просто:

на клавише вверх (тоже попробовал нажать клавишу) - if (e.which == 13) submitForm();

Проблема в том, что я не знаю, как обнаружить, что нажатие ENTER на самом деле произошло из управления автозаполнением

Ответ 1

Вы можете сохранить значение поля на клавише вниз, а затем снова проверить ключ. Если в строке с одним нажатием клавиши более 1 символ отличается от другого, можно предположить, что элемент автозаполнения был выбран, а ввод должен быть проигнорирован.

Единственный случай, когда это не сработает, - это когда у вас есть поле типа: [email protected], и вы выбираете элемент автозаполнения с добавленным только окончательным письмом, клавиша ввода будет непреднамеренно представлять форму.

Надеюсь, что мы начнем как минимум. Я также пытаюсь разобраться в пуленепробиваемом решении. Я обновлю, если найду его.

ИЗМЕНИТЬ

Винт выше. Отсортировано. Если вы проверите клавишу ввода на клавише вверх, а значение поля ввода не совпадает с двумя клавишами вниз/вверх, вы можете предположить, что был выбран элемент автозаполнения.

var loginCurrentInput = '';

$('input').keydown(function(e) {

  loginCurrentInput = $(this).val();

}

$('input').keyup(function(e) {

  //if enter key pressed
  if(e.keyCode == 13) {

    //check for changed input value
    if($(this).val() != loginCurrentInput) {

      loginCurrentInput = $(this).val();
      return false;

    }

    $('#button').trigger('click');

  }

}