Хорошая практика для извлечения данных из нескольких входных таблиц - PullRequest
1 голос
/ 30 апреля 2020

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

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

Я не уверен, что все в порядке или вы можете поделиться лучший способ в этом.

Вот что я делаю ниже:

  • Итерация по каждой строке таблицы и назначение каждого идентификатора строки для объекта в качестве ключа.
  • Итерация по этому объекту для получения входных значений каждой строки
  • Сохранение ввода в объект в виде значений, разделенных _, для разделения на массив

Live Demo

<!DOCTYPE html>
<html>

<body>

    <table>
        <tbody id="dynamic_form_tbody">
            <tr id="123">
                <td><input type="text"></td>
                <td><input type="date"></td>
                <td><input type="radio" name="choice" value="yes"> <input type="radio" name="choice" value="no"></td>
            </tr>
            <tr id="1256">
                <td><input type="text"></td>
                <td><input type="date"></td>
                <td><input type="radio" name="choice" value="yes"> <input type="radio" name="choice" value="no"></td>            </tr>
            <tr id="1212">
                <td><input type="text"></td>
                <td><input type="date"></td>
                <td><input type="radio" name="choice" value="yes"> <input type="radio" name="choice" value="no"></td>            </tr>
        </tbody>
    </table>
    <input type="button" id="log" value="console.log data">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

    <script>
        $(document).ready(() => {
            var $btn = $('#log')

            $btn.click(e => {
                var table_tbody = $('#dynamic_form_tbody')

                var dynamic_form_data = {}
                //collect each row's id
                table_tbody.find("tr").each(function (e) {
                    console.log('tr found with id: ' + $(this).attr('id'))
                    id = $(this).attr('id')
                    dynamic_form_data[id] = ""
                })

                for (let id in dynamic_form_data) {
                    $(`tr#${id} input`).each(function (e) {
                        let $this_val = $(this).val() || null
                        dynamic_form_data[id] += [$this_val + '_']
                    })
                }

                console.log(dynamic_form_data)
            })

        })

    </script>
</body>

</html>

1 Ответ

2 голосов
/ 30 апреля 2020

Некоторые проблемы:

  • Все ваши радиокнопки имеют одинаковое имя, поэтому вы можете выбрать только одну из них во всей таблице. Я полагаю, вы должны иметь возможность выбрать по одному в каждой строке.
  • $(this).val() || null: null бесполезно, так как пустая строка подходит. Если вы решите создать строку вместо массива, то null станет "нулевым", что неотличимо от ввода, которое действительно содержит эти символы. Поэтому я бы отбросил || null.
  • [$this_val + '_'], преобразует строку в массив, но затем этот массив немедленно преобразуется обратно в строку, когда ему присваивается +=.
  • * 1016. * добавит также подчеркивание после последнего значения.
  • Оба значения переключателя (да, нет) всегда добавляются к результату без учета выбора. Вам следует выбрать только тот, который checked
  • Чтобы избежать выбора ни одной из двух переключателей, укажите значение по умолчанию в определении HTML, используя атрибут checked
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...