#javascript #html #jquery #ajax
Вопрос:
Я динамически создаю таблицу с помощью JavaScript/jQuery/html из вызова Ajax. При первой загрузке таблицы она отображается в правильном формате. Однако, когда я выполняю обновление/перезагрузку, форматирование таблицы неверно. Я включил обещание попытаться исправить это в соответствии с тем, как обещать вызов Ajax
Исправлено при первой загрузке:
После перезагрузки:
Сокращенный код-это:
$('#refreshTableBtn').click(function(){
//Re-display the exercise table
exerciseFirstColumnDetails()
.then((numExeDetails) => {
console.log(numExeDetails)
loadExerciseDetails(numExeDetails)
})
.catch((error) => {
console.log()
})
});
function exerciseFirstColumnDetails() {
//Get Patient Exercise Details
$('#exerciseTable tr').empty();
var numExeDetails = 0;
//Get the Patient's exercise headers
return new Promise((resolve, reject) => {
$.ajax({
url: "PatientExerciseHeadersListView",
data : {
ssAccRole : sessionStorage.getItem('ssAccRole'),
ssAccID : sessionStorage.getItem('ssAccID'),
ssPatExeID : sessionStorage.getItem('ssPatExeID'),
},
type: "POST",
cache: false,
//Loading spinner
beforeSend: function() {
$('#loader').show();
},
complete: function(){
$('#loader').hide();
},
})
.fail (function(jqXHR, textStatus, errorThrown) {
$('#ajaxGetUserServletResponse4').text('Error getting Exercise details.');
reject();
})
.done(function(responseJson1a) {
dataType: "json";
if (Object.keys(responseJson1a)[0] == "empty") {
$('#ajaxGetUserServletResponse4').text('No Exercise details.');
}else {
//Create first table column
//Loop through the Execise details
//Populate the variable number of exercise variables and keep count.
$.each(responseJson1a, function() {
numExeDetails ;
var html = "";
html = "<tr id='ExerciseDetail" numExeDetails "' name='" this.edeId "'>";
html = "<td class='bgColourWhiteBold sticky-col'>" this.edeType " - " this.edeUnit "</td>"
html = "</tr>"
$(html).insertBefore($("#InsertSet"));
});
}
resolve(numExeDetails);
});
});
};
function loadExerciseDetails(numExeDetails) {
$.ajax({
url: "PatientExerciseDetailsListView",
data : {
ssAccRole : sessionStorage.getItem('ssAccRole'),
ssAccID : sessionStorage.getItem('ssAccID'),
ssPatExeID : sessionStorage.getItem('ssPatExeID'),
ssPatExeID : sessionStorage.getItem('ssPatExeID'),
viewFrom : $("#viewFromDate").val(),
viewTo : $("#viewToDate").val(),
},
type: "POST",
cache: false,
//Loading spinner
beforeSend: function() {
$('#loader').show();
},
complete: function(){
$('#loader').hide();
},
})
.fail (function(jqXHR, textStatus, errorThrown) {
$('#ajaxGetUserServletResponse4').text('Error getting Exercise details.');
})
.done(function(responseJson1a) {
dataType: "json";
$('#ajaxGetUserServletResponse4').text('');
if (Object.keys(responseJson1a)[0] == "empty") {
//Display an empty table for data entry
//Check if the date range includes today's date.
if (moment($("#viewFromDate").val(), 'DD/MM/YYYY').isAfter(moment())
|| moment($("#viewToDate").val(), 'DD/MM/YYYY').isBefore(moment())){
$('#ajaxGetUserServletResponse4').text('No Patient exercises in this date range.');
}else {
var today = moment(new Date()).format("DD/MM/YYYY");
var todayDay = moment(new Date()).format('ddd')
//If the date range includes todays date then display an empty table for data entry
$("<th class='h1Colour'>Set 1</th>").appendTo($("#tableHeadersSet"));
$("<th class='h1Colour'>Set 2</th>").appendTo($("#tableHeadersSet"));
$("<th class='h1Colour'>Set 3</th>").appendTo($("#tableHeadersSet"));
//Create three sets for each Exercise Detail
for(let i = 1; i <= numExeDetails; i ) {
var ExerciseDetail = "ExerciseDetail" i;
alert(ExerciseDetail);
$("<td class='bgColourWhiteBold sticky-col exeSet'><input type='text' name='exeSet' data-set='1' value='' size='4'></td>").appendTo($('#' ExerciseDetail));
$("<td class='bgColourWhiteBold sticky-col exeSet'><input type='text' name='exeSet' data-set='2' value='' size='4'></td>").appendTo($('#' ExerciseDetail));
$("<td class='bgColourWhiteBold sticky-col exeSet'><input type='text' name='exeSet' data-set='3' value='' size='4'></td>").appendTo($('#' ExerciseDetail));
}
}
}else{
//Display existing sets
}
});
}
HTML:
<table id='exerciseTable'>
<tr id="tableHeadersSet">
<!-- Place for Set row -->
</tr>
<tbody id="tableBody">
<!-- Add each of the Exercise Details -->
<tr id="InsertSet">
<!-- Place for Insert Set button -->
</tr>
</tbody>
</table>
Комментарии:
1. Я не думаю, что там должно быть что-то за пределами
tbody
. На остальное я еще не смотрел.2. @wazz Извините, что вы имеете в виду под этим комментарием, пожалуйста?
3. Первая строка должна быть внутри
thead
тега. Я не знаю, повлияет ли это на вашу проблему, но я думаю, что это более правильно. developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody . «Если вы используете <tbody>, у вас также не может быть строк таблицы (<tbody><tr> элементы), которые являются прямыми дочерними элементами <tr><таблицы>, но не включены в <table><tbody>».4. @wazz Хорошо, я понял, о чем ты говоришь. Я добавил тег thead, который, как вы говорите, более корректен; однако это не решило проблему.
Ответ №1:
Ответ состоит в том, чтобы переместить заполнение первого столбца туда, где я делаю входные строки.
$('#refreshTableBtn').click(function(){
//Re-display the exercise table
exerciseFirstColumnDetails()
.then(({numExeDetails, exercises}) => {
console.log({numExeDetails, exercises})
loadExerciseDetails({numExeDetails, exercises})
})
.catch((error) => {
console.log(error " Error in exerciseOverview.js - call 'loadExerciseDetails' function");
})
});
function exerciseFirstColumnDetails() {
//Get Patient Exercise Details
$('#exerciseTable tr').empty();
var numExeDetails = 0;
var exercises = [];
//Get the Patient's exercise headers
return new Promise((resolve, reject) => {
$.ajax({
url: "PatientExerciseHeadersListView",
data : {
ssAccRole : sessionStorage.getItem('ssAccRole'),
ssAccID : sessionStorage.getItem('ssAccID'),
ssPatExeID : sessionStorage.getItem('ssPatExeID'),
},
type: "POST",
cache: false,
//Loading spinner
beforeSend: function() {
$('#loader').show();
},
complete: function(){
$('#loader').hide();
},
})
.fail (function(jqXHR, textStatus, errorThrown) {
$('#ajaxGetUserServletResponse4').text('Error getting Exercise details.');
reject();
})
.done(function(responseJson1a) {
dataType: "json";
if (Object.keys(responseJson1a)[0] == "empty") {
$('#ajaxGetUserServletResponse4').text('No Exercise details.');
}else {
// $("#chartDisp").show();
//Create first table column
$("<th class='h2Colour sticky-col' colspan='1'>Week</th>").appendTo($("#tableHeadersWeek"));
$("<th class='bgColourWhite sticky-col' colspan='1'>Date</th>").appendTo($("#tableHeadersDate"));
$("<th class='bgColourWhite sticky-col' colspan='1'>Day</th>").appendTo($("#tableHeadersDay"));
$("<th colspan='1' class='tdNoBorder sticky-col'></th>").appendTo($("#tableHeadersSpace1"));
$("<th class='tdNoBorder sticky-col'></th>").appendTo($("#tableHeadersSet"));
//Loop through the Execise details
//Populate the variable number of exercise variables and keep count.
$.each(responseJson1a, function() {
//Pass 'exercises' to the next funtion
exercises[numExeDetails] = this.edeType " - " this.edeUnit;
numExeDetails ;
var html = "";
html = "<tr id='ExerciseDetail" numExeDetails "' name='" this.edeId "'>";
// html = "<td class='bgColourWhiteBold sticky-col'>" this.edeType " - " this.edeUnit "</td>"
html = "</tr>"
$(html).insertBefore($("#InsertSet"));
});
$("<td class='tdNoBorder sticky-col' colspan='1'></td>").appendTo($("#InsertSet"));
}
resolve({numExeDetails, exercises});
});
});
};
function loadExerciseDetails({numExeDetails, exercises}) {
$.ajax({
url: "PatientExerciseDetailsListView",
data : {
ssAccRole : sessionStorage.getItem('ssAccRole'),
ssAccID : sessionStorage.getItem('ssAccID'),
ssPatExeID : sessionStorage.getItem('ssPatExeID'),
ssPatExeID : sessionStorage.getItem('ssPatExeID'),
viewFrom : $("#viewFromDate").val(),
viewTo : $("#viewToDate").val(),
},
type: "POST",
cache: false,
//Loading spinner
beforeSend: function() {
$('#loader').show();
},
complete: function(){
$('#loader').hide();
},
})
.fail (function(jqXHR, textStatus, errorThrown) {
$('#ajaxGetUserServletResponse4').text('Error getting Exercise details.');
})
.done(function(responseJson1a) {
dataType: "json";
$('#ajaxGetUserServletResponse4').text('');
if (Object.keys(responseJson1a)[0] == "empty") {
//Check if the date range includes today's date.
if (moment($("#viewFromDate").val(), 'DD/MM/YYYY').isAfter(moment())
|| moment($("#viewToDate").val(), 'DD/MM/YYYY').isBefore(moment())){
$('#ajaxGetUserServletResponse4').text('No Patient exercises in this date range.');
}else {
var today = moment(new Date()).format("DD/MM/YYYY");
var todayDay = moment(new Date()).format('ddd')
//If the date range includes todays date then display an empty table for data entry
$("<th class='h2Colour' colspan='3'>1</th>").appendTo($("#tableHeadersWeek"));
$("<th class='h1Colour' colspan='3'>" today "</th>").appendTo($("#tableHeadersDate"));
$("<th class='h1Colour' colspan='3'>" todayDay "</th>").appendTo($("#tableHeadersDay"));
$("<th colspan='3' class='tdNoBorder'></th>").appendTo($("#tableHeadersSpace1"));
$("<th class='h1Colour'>Set 1</th>").appendTo($("#tableHeadersSet"));
$("<th class='h1Colour'>Set 2</th>").appendTo($("#tableHeadersSet"));
$("<th class='h1Colour'>Set 3</th>").appendTo($("#tableHeadersSet"));
//Create three sets for each Exercise Detail
var exercisesIdx = 0;
for(let i = 1; i <= numExeDetails; i ) {
var exerciseDetail = "ExerciseDetail" i;
$("<td class='bgColourWhiteBold sticky-col'>" exercises[exercisesIdx] "</td>").appendTo($('#' exerciseDetail));
exercisesIdx ;
$("<td class='bgColourWhiteBold sticky-col exeSet'><input type='text' name='exeSet' data-set='1' value='' size='4'></td>").appendTo($('#' exerciseDetail));
$("<td class='bgColourWhiteBold sticky-col exeSet'><input type='text' name='exeSet' data-set='2' value='' size='4'></td>").appendTo($('#' exerciseDetail));
$("<td class='bgColourWhiteBold sticky-col exeSet'><input type='text' name='exeSet' data-set='3' value='' size='4'></td>").appendTo($('#' exerciseDetail));
}
$("<td class='tdNoBorder sticky-col' colspan='3'><input type='button' name='addSetBtn' class='btn btn-sm h2Colour' style='width:100%' value='Add Set'></td>").appendTo($("#InsertSet"));
}
}else{
//Display existing sets
}
});
}