html слайд-шоу строк таблицы - PullRequest
0 голосов
/ 13 апреля 2020

На странице я заполняю таблицу HTML, где может быть случайное количество строк от 1 до 100. Независимо от количества строк мне нужно показать только 10 строк этой таблицы в одном представлении и следующих 10 слайдах через 5 секунд.

Пример структуры таблицы

<table>
  <thead>
    <th>Competition</th>
    <th>Adam</th>
  </thead>
  <tbody id='tableslide'>
  <tr>
    <td>Swimming</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Running</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>3</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>4</td>
  </tr>
  <tr>
    <td>sample</td>
    <td>5</td>
  </tr>
  <tr>
    <td>test</td>
    <td>6</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>7</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>8</td>
  </tr>
  <tr>
    <td>goto</td>
    <td>9</td>
  </tr>
  <tr>
    <td>mean</td>
    <td>10</td>
  </tr>
  <tr>
    <td>acomon</td>
    <td>11</td>
  </tr>
  <tr>
    <td>server</td>
    <td>12</td>
  </tr>

   <tr>
    <td>Shooting</td>
    <td>13</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>14</td>
  </tr>
  <tr>
    <td>sample</td>
    <td>15</td>
  </tr>
  <tr>
    <td>test</td>
    <td>16</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>17</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>18</td>
  </tr>
  <tr>
    <td>goto</td>
    <td>19</td>
  </tr>
  <tr>
    <td>goto</td>
    <td>20</td>
  </tr>
  <tr>
    <td>goto</td>
    <td>21</td>
  </tr>
   <tr>
    <td>goto</td>
    <td>22</td>
  </tr>
   <tr>
    <td>goto</td>
    <td>23</td>
  </tr>
  </tbody>
</table>

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

$(function () {
    var selectors = [
        ":lt(10)",
        ":gt(9)"
    ];
    var $tableslide = $("#tableslide").children(selectors[1]).hide().end();
    var state = false;
    setInterval(function () {
        var s = state;
        $tableslide.children(selectors[+s]).fadeOut().promise().then(function () {
            $tableslide.children(selectors[+!s]).fadeIn();
        });
        state = !state;
    }, 3000);
});

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Как уже упоминалось в ответе @ antanta - Есть много способов добиться этого, вот мое решение (используя show и hide вместо затухания):

$('table tr:gt(10)').hide();

setInterval(function() {

var last = $('table tr:visible:last')
$('table tr').hide();
(last.next().length ? last.nextAll(':lt(10)', ':not(:visible)') : last.siblings(':lt(10)')).show();
}, 5000);

Объяснение:

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

$('table tr:gt(10)').hide();

setInterval(function() {

var last = $('table tr:visible:last')
$('table tr').hide();
(last.next().length ? last.nextAll(':lt(10)', ':not(:visible)') : last.siblings(':lt(10)')).show();
}, 3000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <thead>
    <th>Competition</th>
    <th>Adam</th>
  </thead>
  <tbody id='tableslide'>
  <tr>
    <td>Swimming</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Running</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>3</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>4</td>
  </tr>
  <tr>
    <td>sample</td>
    <td>5</td>
  </tr>
  <tr>
    <td>test</td>
    <td>6</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>7</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>8</td>
  </tr>
  <tr>
    <td>goto</td>
    <td>9</td>
  </tr>
  <tr>
    <td>mean</td>
    <td>10</td>
  </tr>
  <tr>
    <td>acomon</td>
    <td>11</td>
  </tr>
  <tr>
    <td>server</td>
    <td>12</td>
  </tr>

   <tr>
    <td>Shooting</td>
    <td>13</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>14</td>
  </tr>
  <tr>
    <td>sample</td>
    <td>15</td>
  </tr>
  <tr>
    <td>test</td>
    <td>16</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>17</td>
  </tr>
  <tr>
    <td>Shooting</td>
    <td>18</td>
  </tr>
  <tr>
    <td>goto</td>
    <td>19</td>
  </tr>
  <tr>
    <td>goto</td>
    <td>20</td>
  </tr>
  <tr>
    <td>goto</td>
    <td>21</td>
  </tr>
   <tr>
    <td>goto</td>
    <td>22</td>
  </tr>
   <tr>
    <td>goto</td>
    <td>23</td>
  </tr>
  </tbody>
</table>
0 голосов
/ 13 апреля 2020

Есть много способов достичь этого. Что-то с вашими селекторами не правильно, и IMO вы делаете это слишком сложно и трудно для понимания. Вот рабочий код:

$(function () {
    var $children = $("#tableslide").children();
    var step = 10, total = $children.length, currentStart = 0;

    // hide all
    $children.hide();

    // buffer to know what was shown, you could also go with :visible
    var $lastVisibleItems = $children.slice(currentStart, currentStart + step).show();

    setInterval(function () {
             $lastVisibleItems.fadeOut().promise().then(function () {
            currentStart += step;
            $lastVisibleItems = $children.slice(currentStart, currentStart + step).fadeIn();
          if (currentStart + step >= $children.length) {
            // reset to beginning, actually -step because it will because 0 after +step
            currentStart = -step;
          }
      });
    }, 3000);
});

Рабочая скрипка

Объяснение:

  1. Первый буфер для всех детей элементы
  2. Настройка вашего шага, т.е. видимых элементов сразу.
  3. Настройка текущего запуска, т. е. в любой момент элементы [currentStart, currentStary + step) видимый. Вы используете slice, чтобы получить дочерний массив
  4. В интервальном вызове просто скрыть последние видимые элементы (они уже есть в переменной буфера, нет необходимости проходить через DOM). Увеличьте текущее начало с шагом, покажите новые элементы и снова запишите их в буфер.
  5. Если ваш конечный индекс (текущий старт + шаг) равен или больше всех детей, то сбросьте на ноль (или очистите интервал, если вы хотите остановить анимацию)

ОБНОВЛЕНИЕ:

Поскольку вопрос теперь включает динамическое c заполнение таблицы с помощью ajax вот новый код:

$(function () {
    var interval;
    var $table = $("#tableslide"), $children = $table.children();
    var step = 10, total = $children.length, currentStart = 0;

    function startInterval() {
      return setInterval(function () {
            currentStart += step;
          if (currentStart + step > $children.length) {
                // you have reached the end and you will not render a whole page so clear here
                clearInterval(interval); 
                interval = null;
              } else {
                $lastVisibleItems.fadeOut().promise().then(function () {
                        $lastVisibleItems = $children.slice(currentStart, currentStart + step).fadeIn();
                    });
              }

        }, 3000);
    }

    function restoreInterval() {
            if (!interval) {
            // you have stopped your timer, hence start it again, without changing the currentStart
            interval = startInterval();
          } else {
            // do nothing
          }
    }

    // hide all
    $children.hide();

    // buffer to know what was shown, you could also go with :visible
    var $lastVisibleItems = $children.slice(currentStart, currentStart + step).show();

    interval = startInterval();

    $.ajax({
        url: '/testurl',
        type: 'POST',
        //complete: function(result) { //use for testing
        success: function(result) {
                // modify your DOM with the server response. in my case add 10 dummy rows
            for (var i = 1; i <= 10; i++) {
                $table.append($("<tr><td>Ajax row " + i + "</td><td>" + i + "</td></tr>").hide());
            }
            // add rows to table and do not forget to modify the varuiable $children
            $children = $("#tableslide").children();

            // Restore the interval
            restoreInterval();
        }
    })
});

PS Теперь это немного более сложный код, и я думаю, что вы будете более сбиты с толку, но я надеюсь, что это будет полезно. Замените success на complete, чтобы вы могли проверить его. Независимо от того, сколько ajax вызовов вы сделаете, он будет работать, вы даже можете сделать ajax вызовов из функции интервала, если обнаружите, что вы на 1 или 2 страницы ближе к концу.

...