Обход элементов формы по Enter
Доброго времени суток всем форумчанам!
Стоит такая задача-навесить ряд событий на кнопку Enter. Есть элемент #dialog. На нем есть ряд элементов input и button (кнопка одна "Oтправить") 1) Вызов диалога - нажалтие Enter. 2) Выбор из Datalist - нажатие Enter. 3) Переход к следующему полю input(button) - нажатие Enter. 4) Отправка формы на сервер - нажатие Enter. Отследить нажатие кнопки Enter можно: <script type="text/javascript"> $(document).bind('keydown', function(event) {if (event.keyCode == 13) my_fn(this)};}); </script> А как быть дальше? Как определить открыт Datalist или нет и по нажатию Enter выбрать из Datalist? Как перейти к следующему input? Может стоит создать массив с именами input и переходить по ним? Заранее благодарен! P.S.: Просьба - не убеждайте меня что все события нужно развести на разные клавиши (ins - вызов диалога, tab - переход по input, enter - выбор из списка и отправка формы на сервер). Задача конкретная и "суровая" - все по кнопке Enter. Еще раз спасибо. |
Переход по полям и отправка - навешивай обработчик на саму форму.
Вызов диалога - навешивай на то, что будет вызывать, или общего предка. Не нужно вешать все на document. |
Попытка реализации
Спасибо danik.js.
Почти получилось. Решил сделать так: <script type="text/javascript"> $(document).bind('keydown', function(event) {if (event.keyCode == 13) $('#dialog').dialog('open')};}); $('input:[name="input_1"]').bind('keydown', function(event) {if (event.keyCode == 13) $('input:name="input_2"]').focus()};}); $('input:[name="input_2"]').bind('keydown', function(event) {if (event.keyCode == 13) $('input:[name="input_3"]').focus() };}); $('input:[name="input_3"]').bind('keydown', function(event) {if (event.keyCode == 13) $('input:[name="input_4"]').focus() };}); $('input:[name="input_4"]').bind('keydown', function(event) {if (event.keyCode == 13) $('button:[name="btn_send"]').focus() }; }); </script> В результате: 1) Диалог открывается. 2) По элементам input переходим. Ошибки: 1) В Firefox не обрабатывается Datalist (в Chrome все нормально) 2) Код $('button:[name="btn_send"]').focus() - не только ставит фокус но и как бы нажимает кнопку, а это следующее нажатие на Enter. (В обоих браузерах). Как решить данные "траблы"? |
Насчет datalist - не знаю че эт такое. Насчет отправки - нужно тормозить событие, так как браузер по нажатию на Enter отсылает форму - это его дефолтное действие. Странно что это срабатывает только на последнем поле. Пробуй return false либо event.preventDefault().
Вместо кучи кода лучше что-то вроде: var $inputs = $form.find('input:not([type="hidden"]),select,textarea'); $inputs.on('keydown', function(event) { if (isEnter(event)) { var $next = $inputs.eq($inputs.index(this) + 1); next.focus(); event.preventDefault(); } }); var $submit = $form.find('[type="submit"]'); $submit.on('keydown', function(event) { if (isEnter(event)) this.form.submit(); }); |
Кратко о datalist
Привет всем.
Кратко о Datalist : http://htmlbook.ru/html/datalist Это список значений для быстрого доступа (автодополнения). Интересно: 1) в Хроме - как sql select like "chr%" 2) в Мозиле - как sql select like "%chr%" где: chr - символ(строка) которое вводиться (содержимое input) % - подстановочный символ Мне нравится как работает в Мозиле (жаль что отображает только 5 (далее скрол), как настроить 10 в списке?) |
Пробую так:
$inputs.on('keydown', function(event) { if (isEnter(event)) { $datalist.Event() var $next = $inputs.eq($inputs.index(this) + 1); event.preventDefault();}};) Результата нет. |
Цитата:
функцию isEnter ты должен создать сам. Ну или делать проверку на месте. где вызов $next.focus() ? И про какой результат речь? |
danik.js - спасибо что не бросили тему.
Извините за код. Да упустил в предложенном выше коде $next.focus(). $datalist.Event() - честно я думал перехватить событие в $datalist=$('datalist') Пробовал такой вариант: $inputs.on('keydown', function(event) { if (isEnter(event)) { var $next = $inputs.eq($inputs.index(this) + 1); setTimeout($next.focus(),500); event.preventDefault();} };) Нужного мне результата нет. Да, я прекрасно понимаю что фокус находится в input несмотря на то, что виден datalist и мы можем с клавиатуры стрелками выбрать значение, и следовательно происходит переход $next.focus(). Но почему не срабатывает задержка и выбор значения? Как это перехватить? Еще раз спасибо. |
Цитата:
Цитата:
Понял свой косяк? Кроме того, если ты передашь аргументом непосредственно функцию .focus - получится хрень, потому что она будет оторвана от контекста вызова (оторвана $next). This в javascript, если в курсе - штука необычная и нужно быть внимательным с этим. Решение - анонимная функция, внутри которой уже делай вызов $next.focus() - без отрыва от $next. |
Уважаемый danik.js.
Насколько я понял вы предлагаете: setTimeout(function(){$next.focus();},200); Но и так я не получил необходимого мне результата. |
Часовой пояс GMT +3, время: 05:12. |