Я создаю приложение для ввода данных для некоторых собственных вещей.
Моя команда должна ввести информацию о «предметах», которые могут иметь много «категорий» и наоборот.
Мне нужен быстрый способ позволить им вводить произвольное количество категорий.
Вот моя идея:
На странице ввода элемента у меня будет так, чтобы изначально был один ввод текста для «категорий», и если он выделен вкладкой, пока он пуст, поле ввода удаляется (если оно не единственное), а фокус переходит к следующему поле. Если это поле нет пусто, когда оно выведено из и, если это последнее поле ввода в массиве, тогда будет добавлен и сфокусирован дополнительный ввод текста «категории».
Таким образом, люди могут очень быстро вводить произвольное количество категорий, не отрывая рук от клавиатуры, просто набирая и нажимая вкладку. Затем дважды нажмите вкладку, чтобы обозначить конец списка.
Прежде всего, что вы думаете об этом интерфейсе? Есть ли способ лучше?
Во-вторых, есть ли для этого плагин jQuery (или что-то в этом роде)? Я искал, но не нашел. Я искал scriptaculous / prototype и mootools, но безуспешно.
Я бы предпочел использовать что-то проверенное и проверенное, чем кататься самостоятельно.
Любые советы приветствуются



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


на самом деле это не так уж сложно реализовать, даже с ванильным JS (т.е. без jQuery, прототипа и т.д.), но все проще с jQuery, поэтому я попробую использовать это:
Предполагая такую структуру:
<form id = "myForm">
<div class = "inputRow">
<input type = "text" name = "myInput[]" />
</div>
<div class = "inputRow">
<input type = "text" name = "myInput[]" />
</div>
...
</form>
Вот JS
$('#myForm :text').blur(onBlurHandler);
function onBlurHandler() {
$row = $(this).parent();
if ($row
.nextAll(":has(:text)") // all following divs with a text element
.length == 0 // but there aren't any, we're on the last one
) {
if ($.trim($row.find(":text").val())) { // the text box isn't empty
$copy = $row.clone(true);
$copy
.find(":text") // get the new text box,
.val('') // remove any text in it
.blur(onBlurHandler) // and add the event handler (is this necessary?)
;
$copy.insertAfter($row);
} else if ($row.prev(':has(:text)').length) { // the text box is empty, and this one isn't the first row
$row.remove(); // get rid of the row.
}
}
}
Ответ на комментарии:
thanks for the answer! i've tried it but it doesn't seem to work as intended. i'm on mac firefox. if i tab off the last field, it adds the new one but focuses the address bar. i tried adding:
$copy.find(":text").focus();after the insertAfter line, but it doesn't change anything. any ideas?also if i shift-tab the blurhandler doesn't know i'm going in the opposite direction. is there any way around that?
Хм, я не думал об этом. Что вы можете попробовать сделать, так это поместить элемент после всех ваших текстовых полей, которые могут принимать фокус (например, текстовое поле, которое отображается за пределами экрана, например: margin-left: -10000px). Добавьте к нему обработчик onfocus, чтобы увидеть, пуста ли последняя строка, и если это так, то она была бы добавлена только тогда функцией onBlurHandler, поэтому передайте фокус обратно последней строке. Если последняя строка не пуста, передайте фокус следующему элементу (вероятно, вашей кнопке отправки). Если есть проблемы с последней строкой, еще не существующей в DOM, поместите указанное выше в тайм-аут.
(Если это действительно работает), это должно позволить вашим пользователям переходить вперед и назад без проблем.
также, если я сдвигаю табуляцию, обработчик размытия не знает, что я иду в противоположном направлении. есть ли способ обойти это?
Сначала я попытаюсь решить проблемы, прокомментированные решением nickf.
Установить фокус на вновь созданный вход $copy.find(":text").focus(); не получится. Метод фокуса jQuery только запускает событие, но не вызывает базовый метод фокуса.
Вы можете установить фокус с помощью setTimeout(function(){$copy.find(":text").get(0).focus()}, 10);, но:
setTimeout необходим в firefox, иначе с мигающим курсором будут происходить странные вещи.
IE7 нужен другой вход для фокусировки при переходе с табуляции. Я не нашел способа установить фокус на ввод, если фокус переходит на адресную строку. Полагаю, это не будет проблемой, потому что вам понадобится как минимум кнопка отправки.
Чтобы управлять shift-tab, я пытался отслеживать сфокусированный элемент, чтобы пропустить blurHandler, когда сфокусированный элемент является предыдущим вводом, но полученный код действительно уродлив, поэтому я опубликую его и поищу лучшее решение .
И наконец, вы спрашиваете, что мы думаем об этом пользовательском интерфейсе, и я думаю, что список категорий, разделенных запятыми, легче закодировать и заполнить. :-)
Эти данные подвержены опечаткам, поэтому я использую автозаполнение для каждого ввода текста. Будет ли это работать со списком, разделенным запятыми? (Я бы предпочел использовать текстовое поле, разделенное строкой, если это возможно). Второй вопрос - порядок категорий имеет значение. Я использую сортировочные таблицы jQuery, чтобы упростить ...
... повторный заказ без необходимости вырезать и вставлять и / или повторно вводить данные.
Я тоже играл с вкладкой Shift. Если я могу положиться на наличие фокусируемого элемента формы после динамического списка входных данных, все в порядке. например кнопку или другое поле. Просто создайте новый элемент списка в обработчике фокуса этого элемента вместо обработчика размытия предыдущего «последнего» элемента списка.
обратите внимание, я различаю фокусировку щелчка и неявную фокусировку, наблюдая за мышью. поэтому, если кто-то щелкнет эту кнопку или другое поле, он не расширит список текстовых полей, как если бы они нажали вкладку.
Еще одна вещь, связанная с использованием отдельных тегов ввода, заключается в том, что я раскрашиваю их по-разному, если они содержат нераспознанное значение. Чтобы еще больше уменьшить количество опечаток.
извините, я только что заметил, что повторил то, что вы сказали. я не прочитал эту строку "IE7" полностью (меня интересует только mac firefox)
Список игнорируемых / интересных тегов здесь, в stackoverflow, является примером списка, разделенного пробелами, с автозаполнением.
За то же самое с jQuery мы получили jquery.bassistance.de/autocomplete/demo
Если вы хотите использовать цвета для обозначения нераспознанных значений, ваш дизайн пользовательского интерфейса имеет смысл. Я вижу, что вам удалось решить проблемы, так что продолжайте и забудьте о списке, разделенном запятыми.
Спасибо за ответ! Я пробовал, но похоже, что он работает не так, как задумано. Я использую Mac Firefox. если я убираю последнее поле, оно добавляет новое, но фокусирует адресную строку. я пробовал добавить: $ copy.find (": text"). focus (); после строки insertAfter, но это ничего не меняет. есть идеи?