У меня есть таблица HTML с данными JSON, которые я визуализирую в пользовательском интерфейсе по частям.
Что я делаю
ajax
, затем делю данные на 12-12 строк, потому что на одной странице может быть максимум 12 строк по моему требованию.div
каждые 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.
но каждые 3 секунды я вызываю showRows(), как только он будет завершен, я хочу запустить myFun()
showRows()
не изменит ваши данные/результат, потому что вы получаете данные от myFunc()
. Вы должны добавить флаг, чтобы проверить, все ли данные были загружены или нет.
@NgocNam мои данные загружаются только сразу, всякий раз, когда загружается страница, я показываю данные каждые 3 секунды из полных данных с помощью css hide and show
Я понял твою идею. Попробуйте этот формат: 1. loadDataIntoArray()
. 2. showDataTable(array, index)
. массив - это данные, которые вы загрузили в первую функцию, затем index=1; setInterval(function(){showDataTable(array, index); index+=12; }, 3000);
еще одно предложение: вы должны использовать Vue или AngularJs для лучшего просмотра и обслуживания кода.
Я проверил вашу скрипку и понял, что вам нужно прекратить добавлять класс «уже показанный» на последней странице. Я завернул здесь условие if.
if ($(".hidden:lt(12)").length > 0){
$("tr:not(.hidden):not(.already-shown)").addClass("already-shown");
}
Вам также следует рассмотреть возможность очистки setInterval в блоке else.
Добавление скрипки для справки https://jsfiddle.net/s7gqe1na/1/
в другом состоянии я снова звоню myFun
, но это не отображается должным образом
Что-то вроде этого? jsfiddle.net/s7gqe1na/2 Я обновил скрипку @manishthakur
Да, но, пожалуйста, проверьте мой код с помощью ajax
здесь, во фрагменте кода, я не хочу снова вызывать эту функцию addTable (tableValue), я хочу снова вызывать этот ajax, чтобы новые данные могли загружаться
Когда вы говорите, что это не отображается должным образом, вы не получаете никаких ошибок, верно? Я подозреваю, что это потому, что вы не очищаете предыдущий setInterval и не создаете новый интервал, поэтому теперь у вас есть два запущенных интервала.
эй, я почти понял, пожалуйста, проверьте мой фрагмент кода здесь, в else condition
Я снова вызываю ajax, но проблема в том, что после последней страницы также требуется 3 секунды, чтобы снова вызвать ajax, чего я не хочу, после последней страницы я хочу вызвать ajax немедленно
Я разработал скрипку, похожую на ваш фрагмент кода. Пожалуйста, посмотрите. jsfiddle.net/m2ruqhnd
Давайте продолжить обсуждение в чате.
эй, не могли бы вы проверить это один раз stackoverflow.com/questions/56831552/…
Используйте setInterval для вызова
myFun()
каждые 3 секунды