Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как получить диапазон чисел? (https://javascript.ru/forum/misc/80587-kak-poluchit-diapazon-chisel.html)

CryNet 25.06.2020 13:26

Как получить диапазон чисел?
 
Делаю пагинатор:



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

Например:
Кол-во отображаемых эл.: 10
Страница: 1
Я должен отобразить с 1 по 10 эл. (или с 0 по 9)
---
Кол-во отображаемых эл.: 50
Страница: 2
Я должен отобразить с 51 по 102 эл. (или с 49 по 99)

laimas 25.06.2020 13:34

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

CryNet 25.06.2020 13:41

Цитата:

Сообщение от laimas (Сообщение 526399)
CryNet, этим обычно занимается сервер, по крайней мере только он знает сколько будет страниц, объемы вывода и прочее. Если это и будет готовить клиент, то данные для него все равно должен давать сервер.

Я с вами согласен. Но в моём случае все на фронте: генерация страниц на основе фильтров, конкретной страницы, etc.

Просто я элементарно посчитать не могу)))

laimas 25.06.2020 13:52

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

рони 25.06.2020 14:23

CryNet,
<script>
const pagination = (num, length) => Array.from({length}, (_, i) => num * length - length + i)
document.write(pagination(1, 10)+"<br>");
document.write(pagination(2, 10)+"<br>");
document.write(pagination(1, 50)+"<br>");
document.write(pagination(2, 50))
</script>

CryNet 25.06.2020 15:14

Цитата:

Сообщение от laimas (Сообщение 526403)
Тогда я не понимаю о чем речь, ибо на странице можно оперировать только ее данными, а не страницами, о которых клиент вообще ничего не знает.

Сейчас объясню. Есть страничка. С бэканда приходит объект, а я на фронте на JS генерирую HTML и распихиваю данные по HTML-тегам, разбивая по 10, 20 или 50 элементов, ну и выплёвую на страницу. Отображаю пагинатор. Юзер кликнет на "отображать по 20" - отдам 20 элементов. Кликнет на 2 вторую страницу - первую 20 элементов удалю, а отображу следующую 20 и т.д.. Аналог SPA, только на чистом JS и без виртуального DOM.

CryNet 25.06.2020 15:14

Цитата:

Сообщение от рони (Сообщение 526404)
CryNet,
<script>
const pagination = (num, length) => Array.from({length}, (_, i) => num * length - length + i)
document.write(pagination(1, 10)+"<br>");
document.write(pagination(2, 10)+"<br>");
document.write(pagination(1, 50)+"<br>");
document.write(pagination(2, 50))
</script>

Спасибо, впрочем, как и всегда :)

laimas 25.06.2020 15:17

Цитата:

Сообщение от CryNet
С бэканда приходит объект

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

CryNet 25.06.2020 15:25

Цитата:

Сообщение от laimas (Сообщение 526412)
Ну так с этого и надо было начитать. А далее как рони, а выводить срез массива от выбранной страницы по номеру страницы умноженному на выбранное пользователем число отображаемых.

Я просто не мог понять, что именно вам не понятно. Прошу прощения :)

laimas 25.06.2020 15:32

Ну так прямо написано о пагинаторе, о страницах на странице... Ну как так. А объект, это иное. Да, вы можете формировать динамически пагинатор и по фильтру из объекта, при это будет вывод первой страницы с пагинатором.

Если, к примеру, данные этого объекта поместить в SQL базу на клиенте, то работать можно чисто sql запросами, ровно также как это и делает сервер - строит пагинатор и выводит запрошенные данные. Вот с чем ассоциируется ваш первый пост. :)

Vlasenko Fedor 25.06.2020 15:45

<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>
<div class="container">
    <h3>Variant 1</h3>

    <div id="panel1"></div>
    <h3>Variant 2</h3>

    <div id="panel2"></div>
    <h3>Variant 3</h3>

    <div id="panel3"></div>
    <h3>Variant 4</h3>

    <div id="panel4"></div>
    <h3>Variant 5</h3>

    <div id="panel5"></div>
    <h3>Variant 6</h3>

    <div id="panel6"></div>
    <h3>Variant 7</h3>

    <div id="panel7"></div>
    <h3>Variant 8</h3>

    <div id="current_page">Click on page:</div>
    <div id="panel8"></div>
    <h3>Variant 9</h3>

    <div id="panel9"></div>
    <input type="button" class="btn btn-default" value="Show current page" id="show_page">

    <h3>Variant 10</h3>

    <div id="panel10"></div>
    <input id="range" type="range" min="1" max="100" value="1" title="Range">
    <br>
    <br>
    <br>
</div>
<script src="https://raw.githack.com/vlasenkofedor/pagination/master/pagination.js"></script>
<script>
    Pagination(
            {
                tag: '#panel1',
                sizing: 'pagination-sm',
                current: 3
            }
    ).onclick(showPage);
    Pagination(
            {
                tag: '#panel2'
            }
    ).onclick(showPage);
    Pagination(
            {
                tag: '#panel3',
                sizing: 'pagination-lg',
                current: 5
            }
    ).onclick(showPage);
    Pagination(
            {
                tag: '#panel4',
                prev_next: false,
                current: 2
            }
    ).onclick(showPage);
    Pagination(
            {
                tag: '#panel5',
                first_last: false,
                current: 4
            }
    ).onclick(showPage);
    Pagination(
            {
                tag: '#panel6',
                prev_next: false,
                first_last: false
            }
    ).onclick(showPage);
    Pagination(
            {
                tag: '#panel7',
                row: 7, // кол-во в ряду
                total: 32, // всего
                step: 7, // перелистывать по
                current: 7, // текущая позиция
                prev_text: 'Назад', // prev text
                next_text: 'Вперед', // next text
                last_text: 'Вконец', // last text
                first_text: 'Вначало' // first text
            }
    ).onclick(showPage);
    Pagination(
            {
                tag: '#panel8'
            }
    ).onclick(function (page) {
        document.getElementById('current_page').innerHTML = 'Click on page: ' + page;
    });
    var panel9 = Pagination(
            {
                tag: '#panel9'
            }
    );
    document.getElementById('show_page').addEventListener('click', function () {
        alert(panel9.value);
    }, false);
    var panel10 = Pagination(
            {
                tag: '#panel10',
                row: 10, // кол-во в ряду
                total: 100 // всего
            }
    );
    var range = document.getElementById('range');
    range.addEventListener('change', function () {
        panel10.value = this.value;
    }, false);
    panel10.onclick(function (page) {
        range.value = page;
    });
    function showPage(page) {
        alert('Page: ' + page);
    }
</script>
</body>

https://github.com/vlasenkofedor/pagination

CryNet 25.06.2020 15:45

Цитата:

Сообщение от laimas (Сообщение 526414)
Если, к примеру, данные этого объекта поместить в SQL базу на клиенте...)

О, это кстати интересно. Можно будет подумать от этом на досуге. Спасибо.

laimas 25.06.2020 15:51

Цитата:

Сообщение от CryNet
Можно будет подумать от этом на досуге.

:) Тут не столько это, хотя это удобно, а тем более данным в SQL можно указать индексы, что ускоряет выборку (хотя SQL базу пока не все браузеры поддерживают). Тут сама суть вашего вопроса.

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

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

CryNet 25.06.2020 15:52

Vlasenko Fedor, У меня другой пагинатор: https://codepen.io/CryNet/pen/qBbjVda?editors=1010

Правда я его привёл к виду как на скрине в первом посте.

CryNet 25.06.2020 15:55

laimas,
я понял. Спасибо ещё раз :)


Часовой пояс GMT +3, время: 04:43.