Это сводит меня с ума. Трудно объяснить, но я пойду.
У меня есть одно поле ввода текста на первой странице моего сайта. Я закодировал наблюдателя события keydown, который проверяет keyCode и, если его ENTER (или его эквивалент), он будет проверять входное значение (электронная почта). Если адрес электронной почты является действительным и уникальным в БД, он отправит форму. Базовые вещи, или вы так думаете.
Если я введу свой адрес электронной почты в поле и нажму клавишу ввода, он отлично работает во всех браузерах. Однако, если я наберу первые пару букв, а затем с помощью клавиш со стрелками выберите электронное письмо из выпадающего списка истории (надеюсь, вы понимаете, что я имею в виду здесь), а затем нажмите клавишу ВВОД, результат будет другим. Значение поля формы фиксируется как просто пара букв, которые я набрал, и поэтому проверка не проходит. Кажется, что когда я нажимаю клавишу ввода, чтобы «выбрать» электронное письмо из выпадающего списка истории, браузер прерывает его, как если бы я печатал.
В Chrome и Safari все работает как надо. Так как это должно означать, что когда вы нажимаете ввод, чтобы «выбрать» электронное письмо из выпадающего списка истории, все, что он делает, это помещает этот адрес электронной почты в текстовое поле. Только при втором нажатии клавиши ВВОД запускается наблюдатель события, и электронная почта проверяется.
Надеюсь, что кто-то может пролить свет на то, почему это происходит ... Мое инстинктивное чувство - это браузер, и я не смогу его исправить.
Спасибо
Lee
EDIT:
Чтобы внести ясность в мой вопрос, позвольте мне добавить, что я использую событие «keydown», чтобы зафиксировать момент, когда нажата клавиша ввода. Я пробовал событие «keyup», и это решило мою проблему выше, но затем я не могу остановить отправку формы самостоятельно. Событие «keyup» запускает ПОСЛЕ поведения по умолчанию, поэтому это неправильный выбор для этого.
ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:
Еще раз спасибо, и, между прочим, ваш английский отличный (в ответ на ваш комментарий о плохом английском).
Я изменил свой обработчик событий из этого:
$("emailInputBox").observe("keydown", function(event) {
return submitViaEnter(event, submitSignupFormOne);
});
на это:
$("emailInputBox").observe("keydown", function(event) {
setTimeout(submitViaEnter.curry(event, submitSignupFormOne),0);
});
submitViaEnter
function submitViaEnter(event, callback) {
var code = event.keyCode;
if (code == Event.KEY_RETURN) {
event.stop();
return callback(event);
}
return true;
}
Кажется, что работает, но проблема сейчас в том, что браузеру разрешено выполнять действие по умолчанию перед запуском функции submitViaEnter
, которая означает, что форма отправляется, когда я нажимаю ENTER.