#javascript #jquery #html #ajax #checkbox
#javascript #jquery #HTML #ajax #флажок
Вопрос:
Я написал код, который заполняет html-таблицу с помощью ajax-вызова, используя следующий код —
$.ajax({
type: "POST",
url: "my_url",
data: JSON.stringify(result),
async: true,
dataType: "json",
contentType: "application/json; charset= Shift-JIS",
success: function (response) {
glResp = response;
populateTable(glResp);
},
error: function (error) {
console.log(error);
//alert("Error!!");
}
});
Данные корректно отображаются в таблице с помощью флажка перед каждой строкой. Теперь я хочу сначала показать строки, у которых установлены флажки в таблице, и остальные строки после этого. Я написал следующий код, но, похоже, он не работает. Кто-нибудь может помочь?
function populateTable(finalObject) {
var obj = finalObject;
var headers1 = ['Name', 'City', 'Job', 'Salary'];
var table = $("<table id='my-table' />");
var columns = headers1;
columns.unshift('');
var columnCount = columns.length;
var row = $(table[0].insertRow(-1));
for (var i = 0; i < columnCount; i ) {
if (i == 0) {
var headerCell = $("<th><input type='button' id='sort'></th>");
row.append(headerCell);
}
else {
var headerCell = $("<th/>");
headerCell.html([columns[i]]);
row.append(headerCell);
}
}
$.each(obj, function (i, obj) {
$row = '<tr><td><input type="checkbox"></td><td>' obj.Name '</td><td>' obj.City '</td><td>' obj.Job '</td><td>' obj.Salary '</td></tr>';
table.append(row);
});
var dvTable = $("#dvCSV");
dvTable.html("");
dvTable.append(table);
}
$(function () {
$('#sort').on('click', function () {
var newTable = $('<table class="table"></table>');
$('.my-table').find('tr').each(function ($index, $value) {
if ($(this).find('input[type=checkbox]').is(':checked')) {
newTable.prepend($(this));
} else {
newTable.append($(this));
}
});
$('.table').replaceWith(newTable);
});
});
Ответ №1:
Вы можете сделать это следующим образом. Просмотрите все, tr
как вы делаете, и добавьте те, tr
которые были сняты checkbox
в последнем из table
.
$('#dvCSV').on('click', '#sort', function () {
$('#my-table').find('tr:not(:first)').each(function () {
if (!$(this).find(':checkbox').is(':checked'))
$('#my-table').append(this);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="my-table">
<tr>
<th>
X
</th>
<th>Row Name</th>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>Row 1</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>Row 2</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>Row 3</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>Row 4</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>Row 5</td>
</tr>
</table>
<div id="dvCSV">
<button id="sort">Sort</button>
</div>
Комментарии:
1. Привет! Я пытался это сделать, но это не решает проблему. Я обнаружил, что проблема заключается в том, что событие «click» этой кнопки в заголовке таблицы
t getting triggered. Maybe because its appended dynamically by JS or some other reason that I am unaware of. Can you recognize why that click event isn
не запускается?2. Вам необходимо делегирование события для динамически генерируемого элемента. Смотрите обновленное событие щелчка. @firstStep
3. Вау! Спасибо, приятель. Сегодня узнал кое-что новое. Это сработало. Извините за беспокойство еще раз, но добавление, происходящее с таблицей, теперь сдвигает строку моего заголовка, и строки с установленными флажками добавляются над заголовком. Как я могу сделать это правильно?
4. Вам нужно пропустить первую строку, используя
:not
псевдоселектор типаfind('tr:not(:first)')
. Смотрите обновленный ответ. @firstStep