У меня есть html-таблица со столбцом состояния, которое может иметь текстовое значение «одобрено», «отклонено» и т. д. Я хочу сопоставить столбец состояния со входным значением из выбранного радиовхода. Для каждой строки, если текст в столбце состояния соответствует выбранному радиовходу, показать строку; в противном случае скрыть его. Например, если значение input[type = "radio"]
равно «ПОЗДНО», отобразите все строки, чей статус td text равен «ПОЗДНО», и скройте другие строки.
var val = $(".radio:checked").val();
$('.table tbody tr').each(function () {
var latevalues = $.trim($(this).find('td').eq(6).text()) === val;
if (latevalues === val) {
$(this).parent().toggle();
}
});
<!-- begin snippet: js hide: false console: true babel: false -->
<div class = "row">
<div class = "col-sm-2">
<!-- <form> -->
<div class = "radio">
<label>
<input type = "radio" name = "radio" class = "radio" id = "pending" value = "LATE" checked = "checked">
Pending(Default)
</label>
</div>
<div class = "radio">
<label>
<input type = "radio" name = "radio" class = "radio" id = "approve" value = "A">
Approved
</label>
</div>
<div class = "radio">
<label>
<input type = "radio" name = "radio" class = "radio" id = "Rejected" value = "R">
Rejected
</label>
</div>
</div>
</div>
<table class = "table table-striped" style = "width: 100%; table-layout: fixed;">
<thead>
<tr>
<th>Number</th>
<th>Comments</th>
<th>Submit</th>
<th>Occassionent</th>
<th>Review</th>
<th>Status</th> -----> column to match values
<th>Admin</th>
<th>By</th>
<th>Date</th>
<th>Managers Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<a href = "employees>
<span>49656</span>
<span> - </span>
<span> 24 May 2021</span>
</a>
</td>
<td>
</td>
<td>
<div> Due:</div>
<div> 24 May 2021</div>
<div> Act:</div>
<div> <b class = "danger">9 Apr 2023</b></div>
</td>
<td>
</td>
<td>
<div> Due:</div>
<div> 16 Apr 2023</div>
<div> Act:</div>
<div> <span>9 Apr 2023</span>
</div>
</td>
<td>
<div> </div>
<div> </div>
<div><b class = "success">LATE</b></div>---------->Status column Show this status if matches the input boxes
</td>
<td>
<div>
<dl>
<dd>Joe Anthony</dd>
</dl>
</div>
</td>
<td style = "width: 90px;">
</td>
<td style = "width: 80px;">
</td>
<td style = "width: 70px;">
</td>
</tr>
<tr>
<td>
<a href = "employees>
<span>49656</span>
<span> - </span>
<span> 24 May 2021</span>
</a>
</td>
<td>
</td>
<td>
<div> Due:</div>
<div> 24 May 2021</div>
<div> Act:</div>
<div> <b class = "danger">9 Apr 2023</b></div>
</td>
<td>
</td>
<td>
<div> Due:</div>
<div> 16 Apr 2023</div>
<div> Act:</div>
<div> <span>9 Apr 2023</span>
</div>
</td>
<td>
<div> </div>
<div> </div>
<div><b class = "success">A</b></div>---------->Status column Show this status if matches the input boxes
</td>
<td>
<div>
<dl>
<dd>Joe Anthony</dd>
</dl>
</div>
</td>
<td style = "width: 90px;">
</td>
<td style = "width: 80px;">
</td>
<td style = "width: 70px;">
</td>
</tr>
<tr>
<td>
<a href = "employees>
<span>49656</span>
<span> - </span>
<span> 24 May 2021</span>
</a>
</td>
<td>
</td>
<td>
<div> Due:</div>
<div> 24 May 2021</div>
<div> Act:</div>
<div> <b class = "danger">9 Apr 2023</b></div>
</td>
<td>
</td>
<td style = "width: 90px;">
<div> Due:</div>
<div> 16 Apr 2023</div>
<div> Act:</div>
<div> <span>9 Apr 2023</span>
</div>
</td>
<td>
<div> </div>
<div> </div>
<div><b class = "success">R</b></div>----------> Status column Show this status if matches the input boxes
</td>
<td>
<div>
<dl>
<dd>Mark Anthony</dd>
</dl>
</div>
</td>
<td style = "width: 90px;">
</td>
<td style = "width: 80px;">
</td>
<td style = "width: 70px;">
</td>
</tr>
Во-первых, метод jQuery .eq отсчитывается от нуля, поэтому, чтобы получить шестой <td>
в строке, вам нужно использовать .eq(5)
(.eq(0) would get the first
`).
Далее у вас есть дополнительное сравнение. Вы присваиваете переменной latevalues
логический результат сравнения текста в каждом <td>
на равенство с выбранным значением переключателя. Затем вы берете этот логический результат и сравниваете его с выбранным значением радио: if (latevalues === val)
. Это всегда будет возвращать false.
Кроме того, ваши значения радио имеют противоречивые регистры (прописные, строчные и т. д.). Я бы рекомендовал в нижнем регистре выбранное значение радио и текстовые значения, с которыми оно сравнивается, чтобы сделать сопоставление эффективным без учета регистра.
Исправленный код:
const updateState = () => {
const filterStatus = ($(".radio:checked").val() || '').toLowerCase();
$('.table tbody tr').each(function() {
const rowStatus = ($.trim($(this).find('td').eq(5).text()) || '').toLowerCase();
$(this).toggle(rowStatus === filterStatus);
});
};
$('input[name = "radio"]').on('change', updateState);
updateState();
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "row">
<div class = "col-sm-2">
<!-- <form> -->
<div class = "radio">
<label>
<input type = "radio" name = "radio" class = "radio" id = "pending" value = "LATE" checked = "checked">
Pending(Default)
</label>
</div>
<div class = "radio">
<label>
<input type = "radio" name = "radio" class = "radio" id = "approve" value = "A">
Approved
</label>
</div>
<div class = "radio">
<label>
<input type = "radio" name = "radio" class = "radio" id = "Rejected" value = "R">
Rejected
</label>
</div>
</div>
</div>
<table class = "table table-striped" style = "width: 100%; table-layout: fixed;">
<thead>
<tr>
<th>Number</th>
<th>Comments</th>
<th>Submit</th>
<th>Occassionent</th>
<th>Review</th>
<th>Status</th> -----> column to match values
<th>Admin</th>
<th>By</th>
<th>Date</th>
<th>Managers Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<a href = "employees">
<span>49656</span>
<span> - </span>
<span> 24 May 2021</span>
</a>
</td>
<td>
</td>
<td>
<div> Due:</div>
<div> 24 May 2021</div>
<div> Act:</div>
<div> <b class = " danger">9 Apr 2023</b></div>
</td>
<td>
</td>
<td>
<div> Due:</div>
<div> 16 Apr 2023</div>
<div> Act:</div>
<div> <span>9 Apr 2023</span>
</div>
</td>
<td>
<div> </div>
<div> </div>
<div><b class = "success">A</b></div>
</td>
<td>
<div>
<dl>
<dd>Joe Anthony</dd>
</dl>
</div>
</td>
<td style = "width: 90px;">
</td>
<td style = "width: 80px;">
</td>
<td style = "width: 70px;">
</td>
</tr>
<tr>
<td>
<a href = "employees">
<span>49656</span>
<span> - </span>
<span> 24 May 2021</span>
</a>
</td>
<td>
</td>
<td>
<div> Due:</div>
<div> 24 May 2021</div>
<div> Act:</div>
<div> <b class = " danger">9 Apr 2023</b></div>
</td>
<td>
</td>
<td style = "width: 90px;">
<div> Due:</div>
<div> 16 Apr 2023</div>
<div> Act:</div>
<div> <span>9 Apr 2023</span>
</div>
</td>
<td>
<div> </div>
<div> </div>
<div><b class = "success">R</b></div>
</td>
<td>
<div>
<dl>
<dd>Mark Anthony</dd>
</dl>
</div>
</td>
<td style = "width: 90px;">
</td>
<td style = "width: 80px;">
</td>
<td style = "width: 70px;">
</td>
</tr>
</tbody>
</table>
@edward678: Вы уверены, что у вас есть совпадающие строки? Фрагмент кода в моем ответе показывает совпадающие строки (хотя совпадений для состояния «Ожидание» нет). Если ваши фактические данные строки отличаются от того, что указано в вопросе, можете ли вы обновить то, что содержится в вопросе?
Существует строка совпадения для ПОЗДНО и Утверждено. Поэтому, когда установлен флажок «Утверждено», я хочу показывать только утвержденное состояние.
@ edward678: Я не вижу, чтобы слово «ПОЗДНО» отображалось где-либо в вашей таблице.
Значение LATE соответствует состоянию ожидания.
Дай мне минуту
Я отредактировал код. pending(Default) — это просто метка для входного значения LATE, Approved — метка для A, а Rejected — метка для R.
Вы используете метку как состояние или значение?
@edward678: Все в порядке. Я обновил свой фрагмент, чтобы использовать «A» и «R» вместо «одобрено» и «отклонено».
Спасибо. скоро сообщу о результатах
Изменили ли вы что-нибудь в своем jquery, и у вас есть рабочий пример, которую я могу увидеть, потому что она все еще отображается только в заголовках?
@ edward678: Я могу поместить его в скрипку, но это тот же код, что и в прикрепленном фрагменте кода. Ссылка на скрипку: jsfiddle.net/76484/cwvj4n1k
@edward678: Нажмите на радиовходы, чтобы увидеть изменение отфильтрованных строк.
Я вижу, ваша рабочий пример работает правильно, поэтому позвольте мне проверить, что я здесь упускаю.
Я понимаю, почему это не работает на моем конце. Из-за ожидания
Как получить незавершенную работу с LATE
@ edward678: В столбце статуса должен быть текст «ПОЗДНО». Если вам нужна другая логика сопоставления, вам необходимо предоставить эту информацию.
У него ПОЗДНО. Посмотрите мой обновленный HTML и посмотрите, не упустил ли я что-то
Ваша рабочий пример отлично работает с LATE. Спасибо
Позвольте мне получить это в моем коде и скоро сообщить вам
Большое спасибо. Отлично работает. Буду признательна.
@edward678: Добро пожаловать. Буду признателен за голосование за этот пост.
Привет, я сделал ошибку и ответил на вопрос слишком быстро. $(это).toggle(rowStatus === filterStatus); показывает только заголовки <thead>. Фактические совпадающие строки не отображаются