Заполнение таблицы значением текстового поля с предыдущей страницы HTML - PullRequest
3 голосов
/ 15 февраля 2020

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

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

Я добавил снимок экрана с таблицей HTML на стр. 2 вместе с тем местом, куда я хотел бы добавить значение текстового поля go (выделено красным прямоугольником).

Вот что у меня есть:

HTML для текстового поля (стр. 1):

<div class="selecttier">
  <h1>5. Number of Clicks</h1>
  <input id="numberofclickstextbox" name="numberofclicks" type="text" value="0" data-total="0" oninput="calculatetier()" />
</div>

JS на странице 1:

$('#sales_order_form_button').click(function() {
        let table_info = [];
        $('input[type=checkbox]').each(
            function(index, value) {
            if($(this).is(':checked')) {
                table_info.push(
                    {
                        name: $(this).attr('name'),
                        value: $(this).attr('value'),
                    }
                );
            }
        });
        let base64str=btoa(JSON.stringify(table_info));

        window.location = "page2.html?table_data=" + base64str;
        });

JS на странице 2:

// Helper function
        function getUrlParameter(name) {
            name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
            var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
            var results = regex.exec(location.href);
            return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, '    '));
        };

        // actual code
        let table_data = getUrlParameter('table_data');
        let data_from_page_1 = JSON.parse(atob(table_data));

        for(let i = 0; i < data_from_page_1.length; i++){
            let row = $("<tr></tr>");
            let recordName = $("<td></td>").text(data_from_page_1[i].name);
            let recordValue = $("<td></td>").text(data_from_page_1[i].value);
            row.append(recordName, recordValue);
            $('#output_table').append(row);
        }

        // code to sum CPC column
        var sum1 = 0;

        $("#output_table tr > td:nth-child(2)").each(
        (_,el) => sum1 += Number($(el).text()) || 0
        );

        $("#sum1").text(sum1);

        //datetime stamp
        var dt = new Date();
        document.getElementById("datetime").innerHTML = dt.toLocaleString();

Выход HTML таблица (страница 2):

<table id="output_table">
        <tr>
            <th>Name</th>
            <th>Value</th>
            <th>Number of Clicks</th>
        </tr>
        <tfoot>
            <tr>
                <th id="total" colspan="1">Total CPC:</th>
                <td id="sum1"></td>
            </tr>
    </tfoot>
    </table>

screenshot of HTML table on page 2

Ответы [ 3 ]

2 голосов
/ 17 февраля 2020

Как указано в комментарии @Manu Varghese, путь к go будет использовать sessionStorage или localStorage.

Во-первых, давайте различать оба. В соответствии с вопросом переполнения стека "HTML5 Локальное хранилище против хранилища сессий" , у нас есть следующий ответ:

localStorage и sessionStorage оба расширяют хранилище. Между ними нет никакой разницы, за исключением предполагаемого «непостоянства» sessionStorage.

То есть данные, хранящиеся в localStorage, сохраняются до тех пор, пока не будут явно удалены. Внесенные изменения сохраняются и доступны для всех текущих и будущих посещений сайта.

Для sessionStorage изменения доступны только для каждой вкладки. Внесенные изменения сохраняются и доступны для текущей страницы на этой вкладке, пока она не будет закрыта. После закрытия сохраненные данные удаляются.

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

Для этого на первой странице вы должны использовать:

sessionStorage.setItem("key", "value")

Вы можете установить элемент вправо, когда почувствуете изменение, как во входном событии размытие .

и когда вы попадете на вторую страницу (именно тогда, когда jQuery вызывает ее стартовое событие), вы получите свои данные, используя:

sessionStorage.getItem("key")

Помните, что localStorage / sessionStorage может поддерживать ограниченный объем данных. Даже если этот лимит намного больше, чем URL, большинство браузеров будут хранить только 2,5–10 МБ на источник, в соответствии с реализацией браузера (вы можете проверить сами по ссылке, рекомендованной в MDN (Mozilla Development Network), http://dev-test.nemikor.com/web-storage/support-test/).

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

Реализация в данном случае

Ваш код можно изменить в три этапа:

  1. Изменить способ сохранения данных для использования storage
  2. Создает JSON объекта, содержащего массив, вместо этого делает JSON, используя сам массив. Затем вы можете добавить больше полей.
  3. Загрузить объект JSON и его поля (массив и число).

Шаг 1 - Переход на sessionStorage

Сейчас у вас есть Javascript на странице 1, создающий массив данных и переводящий эти данные в строку JSON.

Если вы хотите использовать хранилище, а не URL для всех данных, просто измените эти строки кода с:

let base64str=btoa(JSON.stringify(table_info));
window.location = "page2.html?table_data=" + base64str;

на код, который сохранит данные в (локальное / сессионное) хранилище:

let jsonStr=JSON.stringify(table_info); // converts to JSON string
sessionStorage.setItem("oldData", jsonStr); // save to storage
window.location = "page2.html"; // navigate to other page

Обратите внимание, что хранилище может принимать любые string , но только строки, тогда мы можем удалить функцию btoa, но мы должны оставить stringify.

Шаг 2. Добавление дополнительных данных для сохранения

Теперь у вас есть один JSON, который представляет собой массив элементов. Но что вы хотите, так это включить еще одно поле, параллельное этому массиву. Конечно, вы не можете включить его в массив, так как это совсем другое. Итак, что нам нужно сделать, это создать JSON объект, который имеет числовое поле и само поле массива.

Ваша функция для создания массива в порядке, тогда мы будем использовать ту же таблицу "как массив и включите его в новый JSON объект:

let table_data = []; // the array you have
$('input[type=checkbox]').each(
    ... rest of code ...
); // the function that creates the array (I abbreviated it here)

// Creates an object with an array and a number
let jsonObj = {
    table_data: table_data,
    number_of_clicks: theNumberYouHave/* your variable with the number here */
};

// This is the bit above with CHANGES into variable names
// Instead of "table_data", now we save "jsonObj"
let jsonStr=JSON.stringify(jsonObj); // converts the "jsonObj" to a JSON string
sessionStorage.setItem("oldData", jsonStr);
window.location = "page2.html";

Не забудьте изменить" theNumberYouHave "на то, что называется вашей переменной с номером. Вы добавите число в качестве поля объекта JSON.

Другими словами, это просто создаст такую ​​структуру:

{
  number_of_clicks: 5216,
  table_data: [
    { name: "...", value: "..."},
    { name: "...", value: "..."},
    { name: "...", value: "..."},
    ...
  ]
}

Видите? Ваши table_data все еще там, но с новым братом (number_of_clicks) внутри объекта.

Шаг 3 - Загрузка данных со страницы 1

На данный момент у вас есть эти две строки кода в страница 2 для чтения данных со страницы 1:

let table_data = getUrlParameter('table_data');
let data_from_page_1 = JSON.parse(atob(table_data));

Вам нужно просто заменить функцию getUrlParameter для чтения из хранилища и удалить функцию atob, чтобы отразить изменения, которые мы сделали на странице 1, таким образом:

let jsonObj = sessionStorage.getItem("oldData"); // reads the string
let data_from_page_1 = JSON.parse(jsonObj); // parse the JSON string
let table_data = data_from_page_1.table_data; // grab the table data
let number_of_clicks = data_from_page_1.number_of_clicks; // grab the number

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

У вас есть уникальный идентификатор "sum1", который вы можете просто:

$("#sum1").text(number_of_clicks);

И все готово!

1 голос
/ 17 февраля 2020

Я настоятельно рекомендую использовать localStorage и sessionStorage в соответствии с this и this

Page 1 code полный исходный код

        $('#next_page_button').click(function(){
        let table_info = [];
        // Do for checkboxes
        $('.campaignstrategy input[type=checkbox]').each(
            function(index, value){
            if($(this).is(':checked')){
                table_info.push(
                    {
                        name: $(this).attr('name'),
                        value: $(this).attr('value'),
                        type: 'checkbox'
                    }
                );
            }
        });
        $('.campaignstrategy input[type=text]').each(
            function(index, value){
                table_info.push(
                {
                    name: $(this).attr('name'),
                    value: $(this).attr('value'),
                    type: 'text'
                }
            );            
        });
        let base64str=btoa(JSON.stringify(table_info));
        window.location = "page2.html?table_data=" + base64str;
        });

Page 2 Код полный источник


        // Helper function
        function getUrlParameter(name) {
            name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
            var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
            var results = regex.exec(location.href);
            return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, '    '));
        };

        // actual code
        let table_data = getUrlParameter('table_data');
        let data_from_page_1 = JSON.parse(atob(table_data));

        // clear table
        $('#output_table').html("");

        // generator checboxes
        for(let i=0;i<data_from_page_1.length;i++){
            if(data_from_page_1[i].type == "checkbox"){
                let row = $("<tr></tr>");
                let recordName = $("<td></td>").text(data_from_page_1[i].name);
                let recordValue = $("<td></td>").text(data_from_page_1[i].value);
                let recordCount = $("<td></td>").text("");
                row.append(recordName, recordValue, recordCount); // not used but needed
                $('#output_table').append(row);
            }
        }

        // generate textboxes
        for(let i=0;i<data_from_page_1.length;i++){
            if(data_from_page_1[i].type == "text"){
                let row = $("<tr></tr>");
                let recordName = $("<td></td>").text("");
                let recordValue = $("<td></td>").text("");
                let recordCount = $("<td></td>").text(data_from_page_1[i].value);
                row.append(recordName, recordValue, recordCount);
                $('#output_table').append(row);
            }
        }
0 голосов
/ 19 февраля 2020

ОТВЕТ:

Как лучше всего подойти к этому?

  • window.localStorage - хранит данные без срока действия
  • window.sessionStorage - хранит данные за один сеанс
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...