Как проверить, что значение флажка содержит строковое значение из ввода в JavaScript

Я ищу такое решение. У меня есть группа флажков, а поверх него есть текстовое поле, и флажок должен фильтроваться по мере того, как мы печатаем в текстовом поле. Если мы введем «Y», должны отобразиться флажки со значениями, которые содержат «Y» или начинаются с «Y». Остальные флажки будут скрыты или свернуты.

Как это сделать в JavaScript? Если вы запустите этот код, вы увидите таблицу и щелкнете по столбцу заголовка, отобразится сетка фильтра.

$(document).ready(function() {
  $("table th").click(function() {
    showFilterOption(this);
  });
});

var arrayMap = {};

function showFilterOption(tdObject) {
  var filterGrid = $(tdObject).find(".filter");
  if (filterGrid.is(":visible")) {
    filterGrid.hide();
    return;
  }
  $(".filter").hide();

  var index = 0;
  filterGrid.empty();
  var allSelected = true;

  filterGrid.append('<div><input id = "searchtext" type = "text" placeholder = "Search" style = "width: 70% !important"></div>');
  filterGrid.append('<div id = "checkBoxes">');
  filterGrid.append('<label><input type = "checkbox" class = "largerCheckbox" value = "ALL" >ALL</label>')


  var ColorsAvailable = document.getElementById('checkBoxes');
  var check_value = new Array();
  check_value[0] = "Yellow";
  check_value[1] = "Red";
  check_value[2] = "Green";

  var color, p, br;

  for (var count in check_value) {
    color = document.createElement("input");
    color.value = check_value[count];
    color.type = "checkbox";
    color.id = "color" + count;
    p = document.createElement("span");
    p.innerHTML = check_value[count] + ": ";
    br = document.createElement("br");
    ColorsAvailable.appendChild(p);
    ColorsAvailable.appendChild(color);
    ColorsAvailable.appendChild(br);
    filterGrid.append(ColorsAvailable);
  }

  filterGrid.append('</div>');

  if (!allSelected) {
    filterGrid.find("#all").removeAttr("checked");
  }

  filterGrid.append('<div style = "text-align: center"><input id = "close" type = "button" value = "Close" style = "width: 40%"/><input id = "ok" type = "button" value = "Ok" style = "width: 40%"/></div>');
  filterGrid.show();

  var $stxt = filterGrid.find("input[type='text']");
  var $closeBtn = filterGrid.find("#close");
  var $okBtn = filterGrid.find("#ok");
  var $checkElems = filterGrid.find("input[type='checkbox']");
  var $gridItems = filterGrid.find(".grid-item");
  var $all = filterGrid.find("#all");

  $closeBtn.click(function() {
    filterGrid.hide();
    return false;
  });

  $("#searchtext").keyup(function() {
    var inputValue = $('#searchtext').val();
    $("input[type='checkbox']").each(function() {
      if ($(this).attr('value').Contains(inputValue)) {

      } else {
        this.checkbox.Hide(); // here i want to hide
        // that check box
      }

    });

  });


  $okBtn.click(function() {
    filterGrid.find(".grid-item").each(function(ind, ele) {
      if ($(ele).find("input").is(":checked")) {
        $(arrayMap[ind]).show();
      } else {
        $(arrayMap[ind]).hide();
      }
    });

    filterGrid.hide();
    return false;
  });

  $checkElems.click(function(event) {
    event.stopPropagation();
  });

  $gridItems.click(function(event) {
    var chk = $(this).find("input[type='checkbox']");
    $(chk).prop("checked", !$(chk).is(":checked"));
  });

  $all.change(function() {
    var chked = $(this).is(":checked");
    filterGrid.find(".grid-item [type='checkbox']").prop("checked", chked);
  });

  filterGrid.click(function(event) {
    event.stopPropagation();
  });

  return filterGrid;
}
table {
  margin: 0 auto;
  margin-top: 20px;
  width: 100%;
  position: relative;
  overflow: auto;
  overflow-y: overlay;
}

th,
thead {
  position: sticky;
  top: 0;
  border: 1px solid #dddddd;
  background-color: #1f2d54;
  text-align: center;
  color: white;
  table-layout: fixed;
  word-break: break-word;
  height: 45px;
}

.filter {
  position: absolute;
  width: 20vw;
  height: 30vh;
  display: none;
  text-align: left;
  font-size: small;
  z-index: 9999;
  overflow: auto;
  background: #ffffff;
  color: #1f2d54;
  border: 1px solid #dddddd;
}

.filter input {
  margin: 5px !important;
  padding: 0 !important;
  width: 10%;
}

input.largerCheckbox {
  margin: 5px;
  padding: 0;
  width: 13px;
  height: 13px;
}

input[type='checkbox'] {
  vertical-align: middle;
  position: relative;
  bottom: 1px;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table style='padding: 8px;'>
  <tr>
    <th index=0>
      Email
      <div class = "filter"></div>
    </th>
    <th index=1>
      Name
      <div class = "filter"></div>
    </th>
    <th index=2>
      Level
      <div class = "filter"></div>
    </th>
    <th index=3>
      Location
      <div class = "filter"></div>
    </th>
  </tr>

  <tr>
    <td>Email 1</td>
    <td>Name 1</td>
    <td>Level 1</td>
    <td>Location 2</td>
  </tr>
  <tr>
    <td>Email 1</td>
    <td>Name 1</td>
    <td>Level 1</td>
    <td>Location 1</td>
  </tr>
  <tr>
    <td>Email 2</td>
    <td>Name 1</td>
    <td>Level 2</td>
    <td>Location 1</td>
  </tr>
  <tr>
    <td>Email 3</td>
    <td>Name 2</td>
    <td>Level 2</td>
    <td>Location 1</td>
  </tr>
  <tr>
    <td>Email 3</td>
    <td>Name 3</td>
    <td>Level 1</td>
    <td>Location 2</td>
  </tr>
  <tr>
    <td>Email 1</td>
    <td>Name 2</td>
    <td>Level 2</td>
    <td>Location 1</td>
  </tr>
</table>

Пожалуйста, добавьте соответствующий HTML-код к вашему вопросу.

mykaf 10.07.2024 17:57

Почему ваш сценарий работает не так, как ожидалось? Есть ли ошибка в вашей консоли разработчика?

mykaf 10.07.2024 17:58

Добавлен код @mykaf. пожалуйста помоги

KitKat 10.07.2024 18:35

В вашей консоли разработчика написано ($(...).attr(...).Contains не является функцией.

mykaf 10.07.2024 18:37

@mykaf да, я знаю, что «Содержит» — это не функция. Я ожидаю чего-то вроде — Left(checkbox.value) == txtsearch. Я не знаю, как это сделать. Пожалуйста помоги.

KitKat 10.07.2024 18:47

Я думаю, что начинается с может быть вам полезно.

mykaf 10.07.2024 18:50

@mykaf это не работает. if ($(this).attr('value').startsWith(inputValue)) { alert(value); }

KitKat 10.07.2024 19:03

«это не работает» не особенно полезно для отладки. Что оно делает? Есть ли сообщение об ошибке?

mykaf 10.07.2024 19:04

Выберите полосу; либо используйте функции jQuery или DOM, а не смесь; вы просто запутаете себя (и других). Аналогично, используйте заглавные буквы или не делайте этого. Большинство руководств по стилю рекомендуют использовать для JavaScript верблюжий регистр, то есть первая буква всегда должна быть строчной. Используйте префикс переменных, содержащих объекты jQuery, со знаком доллара или без него, но будьте последовательны. Эта смесь только усложняет чтение кода.

Heretic Monkey 10.07.2024 21:27
Поведение ключевого слова "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
9
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Мне пришлось немного изменить ваш код - я обернул флажки метками и переключил их. Вам все равно придется переключить все обратно при проверке «все»

У вас проблемы с повторяющимися идентификаторами.

$(document).ready(function() {
  $("table th").click(function() {
    showFilterOption(this);
  });
});

var arrayMap = {};

function showFilterOption(tdObject) {
  var filterGrid = $(tdObject).find(".filter");
  if (filterGrid.is(":visible")) {
    filterGrid.hide();
    return;
  }
  $(".filter").hide();

  var index = 0;
  filterGrid.empty();
  var allSelected = true;

  filterGrid.append('<div><input id = "searchtext" type = "text" placeholder = "Search" style = "width: 70% !important"></div>');
  filterGrid.append('<div id = "checkBoxes">');
  filterGrid.append('<label><input type = "checkbox" id = "all" class = "largerCheckbox" value = "ALL">ALL</label>')


  var ColorsAvailable = document.getElementById('checkBoxes');
  var check_value = new Array();
  check_value[0] = "Yellow";
  check_value[1] = "Red";
  check_value[2] = "Green";

  var color, label, br;

  for (var count in check_value) {
    color = document.createElement("input");
    color.value = check_value[count];
    color.type = "checkbox";
    color.id = "color" + count;
    label = document.createElement("label");
    label.innerHTML = check_value[count] + ": ";
    br = document.createElement("br");
    label.appendChild(color);
    label.appendChild(br);
    ColorsAvailable.appendChild(label);
    filterGrid.append(ColorsAvailable);
  }

  filterGrid.append('</div>');

  if (!allSelected) {
    filterGrid.find("#all").removeAttr("checked");
  }

  filterGrid.append('<div style = "text-align: center"><input id = "close" type = "button" value = "Close" style = "width: 40%"/><input id = "ok" type = "button" value = "Ok" style = "width: 40%"/></div>');
  filterGrid.show();

  var $stxt = filterGrid.find("input[type='text']");
  var $closeBtn = filterGrid.find("#close");
  var $okBtn = filterGrid.find("#ok");
  var $checkElems = filterGrid.find("input[type='checkbox']");
  var $gridItems = filterGrid.find(".grid-item");
  var $all = filterGrid.find("#all");

  $closeBtn.click(function() {
    filterGrid.hide();
    return false;
  });

  $("#searchtext").on('input',function() {
    let inputValue = $(this).val().toLowerCase();
    let allChecked = $('#all').is(':checked');
    $("#checkBoxes input[type='checkbox']").each(function() {
      const val = $(this).attr('value').toLowerCase()
      $(this).closest('label').toggle(allChecked || val.includes(inputValue));
    });

  });


  $okBtn.click(function() {
    filterGrid.find(".grid-item").each(function(ind, ele) {
      if ($(ele).find("input").is(":checked")) {
        $(arrayMap[ind]).show();
      } else {
        $(arrayMap[ind]).hide();
      }
    });

    filterGrid.hide();
    return false;
  });

  $checkElems.click(function(event) {
    event.stopPropagation();
  });

  $gridItems.click(function(event) {
    var chk = $(this).find("input[type='checkbox']");
    $(chk).prop("checked", !$(chk).is(":checked"));
  });

  $all.on('click', function() {
    var chked = $(this).is(":checked");
    filterGrid.find("[type=checkbox]").prop("checked", chked);
  });

  filterGrid.click(function(event) {
    event.stopPropagation();
  });

  return filterGrid;
}
table {
  margin: 0 auto;
  margin-top: 20px;
  width: 100%;
  position: relative;
  overflow: auto;
  overflow-y: overlay;
}

th,
thead {
  position: sticky;
  top: 0;
  border: 1px solid #dddddd;
  background-color: #1f2d54;
  text-align: center;
  color: white;
  table-layout: fixed;
  word-break: break-word;
  height: 45px;
}

.filter {
  position: absolute;
  width: 20vw;
  height: 30vh;
  display: none;
  text-align: left;
  font-size: small;
  z-index: 9999;
  overflow: auto;
  background: #ffffff;
  color: #1f2d54;
  border: 1px solid #dddddd;
}

.filter input {
  margin: 5px !important;
  padding: 0 !important;
  width: 10%;
}

input.largerCheckbox {
  margin: 5px;
  padding: 0;
  width: 13px;
  height: 13px;
}

input[type='checkbox'] {
  vertical-align: middle;
  position: relative;
  bottom: 1px;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table style='padding: 8px;'>
  <tr>
    <th index=0>
      Email
      <div class = "filter"></div>
    </th>
    <th index=1>
      Name
      <div class = "filter"></div>
    </th>
    <th index=2>
      Level
      <div class = "filter"></div>
    </th>
    <th index=3>
      Location
      <div class = "filter"></div>
    </th>
  </tr>

  <tr>
    <td>Email 1</td>
    <td>Name 1</td>
    <td>Level 1</td>
    <td>Location 2</td>
  </tr>
  <tr>
    <td>Email 1</td>
    <td>Name 1</td>
    <td>Level 1</td>
    <td>Location 1</td>
  </tr>
  <tr>
    <td>Email 2</td>
    <td>Name 1</td>
    <td>Level 2</td>
    <td>Location 1</td>
  </tr>
  <tr>
    <td>Email 3</td>
    <td>Name 2</td>
    <td>Level 2</td>
    <td>Location 1</td>
  </tr>
  <tr>
    <td>Email 3</td>
    <td>Name 3</td>
    <td>Level 1</td>
    <td>Location 2</td>
  </tr>
  <tr>
    <td>Email 1</td>
    <td>Name 2</td>
    <td>Level 2</td>
    <td>Location 1</td>
  </tr>
</table>

Большое спасибо за ваш ответ. Но когда мы нажимаем ВСЕ, остальные галочки не проверяются. Кроме того, когда мы печатаем «а» в текстовом поле, фильтрация не выполняется. Не могли бы вы также предложить решение этих проблем. Спасибо.

KitKat 11.07.2024 11:17

Да, я не делал «все». Что вы имеете в виду под «а» У вас есть Y(желтый), R(ed), G)зеленый

mplungjan 11.07.2024 11:27

Я исправил "все", у тебя ничего не было с id = "all"

mplungjan 11.07.2024 12:13

@KitKat Я не понимаю, чего здесь не хватает в фильтрации. Если вам нужно нажать «ОК», чтобы отфильтровать столбцы, это просто продолжение сценария, который я уже написал.

mplungjan 12.07.2024 09:45

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