Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.10.2014, 12:42
Аспирант
Отправить личное сообщение для myshara Посмотреть профиль Найти все сообщения от myshara
 
Регистрация: 25.06.2012
Сообщений: 37

Обход элементов формы по 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.

Еще раз спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 06.10.2014, 13:21
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Переход по полям и отправка - навешивай обработчик на саму форму.
Вызов диалога - навешивай на то, что будет вызывать, или общего предка. Не нужно вешать все на document.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 06.10.2014, 17:16
Аспирант
Отправить личное сообщение для myshara Посмотреть профиль Найти все сообщения от myshara
 
Регистрация: 25.06.2012
Сообщений: 37

Попытка реализации
Спасибо 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. (В обоих браузерах).

Как решить данные "траблы"?
Ответить с цитированием
  #4 (permalink)  
Старый 06.10.2014, 18:25
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Насчет 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();
});
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 06.10.2014, 21:39
Аспирант
Отправить личное сообщение для myshara Посмотреть профиль Найти все сообщения от myshara
 
Регистрация: 25.06.2012
Сообщений: 37

Кратко о datalist
Привет всем.

Кратко о Datalist : http://htmlbook.ru/html/datalist

Это список значений для быстрого доступа (автодополнения).

Интересно:
1) в Хроме - как sql select like "chr%"
2) в Мозиле - как sql select like "%chr%"

где: chr - символ(строка) которое вводиться (содержимое input)
% - подстановочный символ

Мне нравится как работает в Мозиле (жаль что отображает только 5 (далее скрол), как настроить 10 в списке?)
Ответить с цитированием
  #6 (permalink)  
Старый 08.10.2014, 11:27
Аспирант
Отправить личное сообщение для myshara Посмотреть профиль Найти все сообщения от myshara
 
Регистрация: 25.06.2012
Сообщений: 37

Пробую так:

$inputs.on('keydown', function(event) {
if (isEnter(event)) {
$datalist.Event()
var $next  = $inputs.eq($inputs.index(this) + 1);
event.preventDefault();}};)


Результата нет.
Ответить с цитированием
  #7 (permalink)  
Старый 08.10.2014, 11:31
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от myshara
$datalist.Event()
Это что?
функцию isEnter ты должен создать сам. Ну или делать проверку на месте.
где вызов $next.focus() ? И про какой результат речь?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #8 (permalink)  
Старый 08.10.2014, 19:45
Аспирант
Отправить личное сообщение для myshara Посмотреть профиль Найти все сообщения от myshara
 
Регистрация: 25.06.2012
Сообщений: 37

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(). Но почему не срабатывает задержка и выбор значения? Как это перехватить?

Еще раз спасибо.
Ответить с цитированием
  #9 (permalink)  
Старый 08.10.2014, 21:23
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от myshara
Но почему не срабатывает задержка
Потому что ты незамедлительно вызываешь функцию:
Сообщение от myshara
$next.focus()
Откуда тут задержке взяться. setTimeout вхолостую срабатывает, потому как ждет аргументом функцию, а ты передаешь результат вызова функции focus()
Понял свой косяк? Кроме того, если ты передашь аргументом непосредственно функцию .focus - получится хрень, потому что она будет оторвана от контекста вызова (оторвана $next). This в javascript, если в курсе - штука необычная и нужно быть внимательным с этим. Решение - анонимная функция, внутри которой уже делай вызов $next.focus() - без отрыва от $next.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #10 (permalink)  
Старый 09.10.2014, 09:42
Аспирант
Отправить личное сообщение для myshara Посмотреть профиль Найти все сообщения от myshara
 
Регистрация: 25.06.2012
Сообщений: 37

Уважаемый danik.js.

Насколько я понял вы предлагаете:

setTimeout(function(){$next.focus();},200);


Но и так я не получил необходимого мне результата.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как подсчитать кол-во элементов формы определенного типа ratkus91 ExtJS 4 19.05.2014 12:41
Как сделать обход элементов внутри DIV reno4 jQuery 4 24.07.2013 13:30
Как достучаться до всех элементов формы ganzalik228 Events/DOM/Window 4 26.05.2012 18:10
Доступ к значениям элементов формы модального окна. =VNK= jQuery 5 14.01.2012 16:00
Отменить submit формы при нажатии enter MaxStoun Events/DOM/Window 5 07.04.2011 19:00