Динамически растущий массив текстовых вводов (HTML / JavaScript)

Я создаю приложение для ввода данных для некоторых собственных вещей.

Моя команда должна ввести информацию о «предметах», которые могут иметь много «категорий» и наоборот.

Мне нужен быстрый способ позволить им вводить произвольное количество категорий.

Вот моя идея:

На странице ввода элемента у меня будет так, чтобы изначально был один ввод текста для «категорий», и если он выделен вкладкой, пока он пуст, поле ввода удаляется (если оно не единственное), а фокус переходит к следующему поле. Если это поле нет пусто, когда оно выведено из и, если это последнее поле ввода в массиве, тогда будет добавлен и сфокусирован дополнительный ввод текста «категории».

Таким образом, люди могут очень быстро вводить произвольное количество категорий, не отрывая рук от клавиатуры, просто набирая и нажимая вкладку. Затем дважды нажмите вкладку, чтобы обозначить конец списка.

Прежде всего, что вы думаете об этом интерфейсе? Есть ли способ лучше?

Во-вторых, есть ли для этого плагин jQuery (или что-то в этом роде)? Я искал, но не нашел. Я искал scriptaculous / prototype и mootools, но безуспешно.

Я бы предпочел использовать что-то проверенное и проверенное, чем кататься самостоятельно.

Любые советы приветствуются

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
3 204
2

Ответы 2

на самом деле это не так уж сложно реализовать, даже с ванильным 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, поместите указанное выше в тайм-аут.

(Если это действительно работает), это должно позволить вашим пользователям переходить вперед и назад без проблем.

Спасибо за ответ! Я пробовал, но похоже, что он работает не так, как задумано. Я использую Mac Firefox. если я убираю последнее поле, оно добавляет новое, но фокусирует адресную строку. я пробовал добавить: $ copy.find (": text"). focus (); после строки insertAfter, но это ничего не меняет. есть идеи?

Kevin Dente 11.11.2008 09:28

также, если я сдвигаю табуляцию, обработчик размытия не знает, что я иду в противоположном направлении. есть ли способ обойти это?

Kevin Dente 11.11.2008 09:31

Сначала я попытаюсь решить проблемы, прокомментированные решением nickf.

Установить фокус на вновь созданный вход $copy.find(":text").focus(); не получится. Метод фокуса jQuery только запускает событие, но не вызывает базовый метод фокуса.

Вы можете установить фокус с помощью setTimeout(function(){$copy.find(":text").get(0).focus()}, 10);, но:

  • setTimeout необходим в firefox, иначе с мигающим курсором будут происходить странные вещи.

  • IE7 нужен другой вход для фокусировки при переходе с табуляции. Я не нашел способа установить фокус на ввод, если фокус переходит на адресную строку. Полагаю, это не будет проблемой, потому что вам понадобится как минимум кнопка отправки.

Чтобы управлять shift-tab, я пытался отслеживать сфокусированный элемент, чтобы пропустить blurHandler, когда сфокусированный элемент является предыдущим вводом, но полученный код действительно уродлив, поэтому я опубликую его и поищу лучшее решение .

И наконец, вы спрашиваете, что мы думаем об этом пользовательском интерфейсе, и я думаю, что список категорий, разделенных запятыми, легче закодировать и заполнить. :-)

Эти данные подвержены опечаткам, поэтому я использую автозаполнение для каждого ввода текста. Будет ли это работать со списком, разделенным запятыми? (Я бы предпочел использовать текстовое поле, разделенное строкой, если это возможно). Второй вопрос - порядок категорий имеет значение. Я использую сортировочные таблицы jQuery, чтобы упростить ...

Kevin Dente 11.11.2008 15:28

... повторный заказ без необходимости вырезать и вставлять и / или повторно вводить данные.

Kevin Dente 11.11.2008 15:28

Я тоже играл с вкладкой Shift. Если я могу положиться на наличие фокусируемого элемента формы после динамического списка входных данных, все в порядке. например кнопку или другое поле. Просто создайте новый элемент списка в обработчике фокуса этого элемента вместо обработчика размытия предыдущего «последнего» элемента списка.

Kevin Dente 11.11.2008 15:36

обратите внимание, я различаю фокусировку щелчка и неявную фокусировку, наблюдая за мышью. поэтому, если кто-то щелкнет эту кнопку или другое поле, он не расширит список текстовых полей, как если бы они нажали вкладку.

Kevin Dente 11.11.2008 15:37

Еще одна вещь, связанная с использованием отдельных тегов ввода, заключается в том, что я раскрашиваю их по-разному, если они содержат нераспознанное значение. Чтобы еще больше уменьшить количество опечаток.

Kevin Dente 11.11.2008 15:41

извините, я только что заметил, что повторил то, что вы сказали. я не прочитал эту строку "IE7" полностью (меня интересует только mac firefox)

Kevin Dente 11.11.2008 15:49

Список игнорируемых / интересных тегов здесь, в stackoverflow, является примером списка, разделенного пробелами, с автозаполнением.

Serxipc 11.11.2008 17:15

За то же самое с jQuery мы получили jquery.bassistance.de/autocomplete/demo

Serxipc 11.11.2008 17:17

Если вы хотите использовать цвета для обозначения нераспознанных значений, ваш дизайн пользовательского интерфейса имеет смысл. Я вижу, что вам удалось решить проблемы, так что продолжайте и забудьте о списке, разделенном запятыми.

Serxipc 11.11.2008 17:26

Другие вопросы по теме