Как перезагрузить Div с динамическим временем

У меня есть таблица HTML с данными JSON, которые я визуализирую в пользовательском интерфейсе по частям.

Что я делаю

  • Я вызываю полные данные сразу через ajax, затем делю данные на 12-12 строк, потому что на одной странице может быть максимум 12 строк по моему требованию.
  • Я обновляю div каждые 3 секунды и показываю 12-12 строк одновременно.
  • Когда страница загружается, я показываю первые 12 строк, затем через 3 секунды скрываю первые 12 и показываю следующие 12
  • Вот как я делаю свою работу

Чего я пытаюсь достичь

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

  • Я пытаюсь сделать этот ajax вызов снова, когда полные данные загружены

Рабочий код

$(document).ready(function() {
  myFun();

  function myFun() {
    $.ajax({
      async: true,
      url: "MenuDisplay",
      method: "GET",
      dataType: "json",
      contentType: "application/json; charset=utf-8",
      success: function(tableValue) {

        addTable(tableValue)
        window.setInterval(showRows, 3000);
        showRows();

      }
    });
  }






  function showRows() {
    // Any TRs that are not hidden and not already shown get "already-shown" applies
    if ($(".hidden:lt(12)").length > 0) {
      $("tr:not(.hidden):not(.already-shown)").addClass("already-shown");
    } else {
      $("tr:not(.hidden):not(.already-shown)").addClass("already-shown"); // this one is also calling after 3 seconds after last page i want to call this imidiatly 
      $.ajax({
        async: true,
        url: "MenuDisplay",
        method: "GET",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function(tableValue) {

          addTable(tableValue)


        }
      });
    }

    $(".hidden:lt(12)").removeClass("hidden"); // this one is to hide previous  rows and show next 
  }

  function addTable(tableValue) {
    var $tbl = $("<table />", {
        "class": "table fixed"
      }),
      $tb = $("<tbody/>"),
      $trh = $("<tr/>");

    var split = Math.round(tableValue.length / 4);
    for (i = 0; i < split; i++) {
      $tr = $("<tr/>", {
        class: "hidden "
      });

      for (j = 0; j < 4; j++) {
        $.each(tableValue[split * j + i], function(key, value) {
          if (typeof(value) === "number") {
            $("<td/>", {
              "class": "text-right color" + (j + 1)
            }).html(value).appendTo($tr);
          } else {
            $("<td/>", {
              "class": "text-left color" + (j + 1)
            }).html(value).appendTo($tr);
          }

        });
      }
      $tr.appendTo($tb);
    }
    $tbl.append($tb);
    $("#DisplayTable").html($tbl);
  }



});
tbody>tr>td {
  white-space: normal;
  border-collapse: collapse;
  font-family: Verdana;
  font-weight: bold;
  font-size: .9em;
}

td:nth-child(2),
td:nth-child(4),
td:nth-child(6),
td:nth-child(8) {
  width: 85px;
  max-width: 85px;
  height: 63px
}

.fixed {
  table-layout: fixed;
}

.color1 {
  background: #4AD184;
}

.color2 {
  background: #EA69EF;
}

.color3 {
  background: #E1A558;
}

.color4 {
  background: #F4F065;
}

.hidden,
.already-shown {
  display: none;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<div id = "DisplayTable"></div>

Проверьте Эта рабочий пример для рабочего примера с данными JSON.

Используйте setInterval для вызова myFun() каждые 3 секунды

Ngoc Nam 30.05.2019 07:52

но каждые 3 секунды я вызываю showRows(), как только он будет завершен, я хочу запустить myFun()

manish thakur 30.05.2019 07:54
showRows() не изменит ваши данные/результат, потому что вы получаете данные от myFunc(). Вы должны добавить флаг, чтобы проверить, все ли данные были загружены или нет.
Ngoc Nam 30.05.2019 07:58

@NgocNam мои данные загружаются только сразу, всякий раз, когда загружается страница, я показываю данные каждые 3 секунды из полных данных с помощью css hide and show

manish thakur 30.05.2019 08:02

Я понял твою идею. Попробуйте этот формат: 1. loadDataIntoArray(). 2. showDataTable(array, index). массив - это данные, которые вы загрузили в первую функцию, затем index=1; setInterval(function(){showDataTable(array, index); index+=12; }, 3000);

Ngoc Nam 30.05.2019 08:15

еще одно предложение: вы должны использовать Vue или AngularJs для лучшего просмотра и обслуживания кода.

Ngoc Nam 30.05.2019 08:18
Поведение ключевого слова "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) для оценки ваших знаний,...
1
6
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

if ($(".hidden:lt(12)").length > 0){
  $("tr:not(.hidden):not(.already-shown)").addClass("already-shown");
}

Вам также следует рассмотреть возможность очистки setInterval в блоке else.

Добавление скрипки для справки https://jsfiddle.net/s7gqe1na/1/

в другом состоянии я снова звоню myFun, но это не отображается должным образом

manish thakur 30.05.2019 08:28

Что-то вроде этого? jsfiddle.net/s7gqe1na/2 Я обновил скрипку @manishthakur

Birju Shah 30.05.2019 08:33

Да, но, пожалуйста, проверьте мой код с помощью ajax здесь, во фрагменте кода, я не хочу снова вызывать эту функцию addTable (tableValue), я хочу снова вызывать этот ajax, чтобы новые данные могли загружаться

manish thakur 30.05.2019 08:38

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

Birju Shah 30.05.2019 08:42

эй, я почти понял, пожалуйста, проверьте мой фрагмент кода здесь, в else condition Я снова вызываю ajax, но проблема в том, что после последней страницы также требуется 3 секунды, чтобы снова вызвать ajax, чего я не хочу, после последней страницы я хочу вызвать ajax немедленно

manish thakur 30.05.2019 08:45

Я разработал скрипку, похожую на ваш фрагмент кода. Пожалуйста, посмотрите. jsfiddle.net/m2ruqhnd

Birju Shah 30.05.2019 08:51

Давайте продолжить обсуждение в чате.

manish thakur 30.05.2019 08:53

эй, не могли бы вы проверить это один раз stackoverflow.com/questions/56831552/…

manish thakur 01.07.2019 11:29

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