Это сводит меня с ума. Его трудно объяснить, но я пойду.
У меня есть одно текстовое поле ввода на первой странице моего сайта. Я закодировал наблюдателя событий keydown, который проверяет keyCode, и если его ENTER (или equiv), itll проверит входное значение (email). Если письмо является действительным и уникальным в БД, оно отправит форму. Базовый материал, или так вы думаете.
Если я набираю свой адрес электронной почты в поле и нажимаю Enter, он отлично работает во всех браузерах. Однако, если я набираю первые пару букв, а затем с помощью клавиш со стрелками выбираю сообщение из раскрывающегося списка истории (надеюсь, что вы знаете, что я имею в виду здесь), а затем нажмите enter, результат будет другим. Значение поля формы записывается как только пара букв, которые я набрал, и поэтому проверка не выполняется. Кажется, что когда я нажимаю клавишу ввода, чтобы "выбрать" письмо из раскрывающегося списка истории, браузер прерывает это, как будто я печатаю.
В Chrome и Safari он работает так, как должен. Как это должно означать, что когда вы нажимаете клавишу ввода, чтобы "выбрать" письмо из раскрывающегося списка истории, все, что он делает, помещает этот адрес электронной почты в текстовое поле. Только на втором нажатии клавиши ENTER он запускает наблюдателя событий, и электронное письмо проверяется.
Надеюсь, что кто-то может пролить свет на то, почему это происходит... Мое чувство кишки - это его браузерная вещь, и я буду чем-то неспособен исправить.
Спасибо Ли
EDIT: Чтобы добавить разъяснение к моему вопросу, позвольте мне добавить, что Im использует событие "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.