Console.log срабатывает в операторе if, но остальная часть кода не срабатывает

Я пытаюсь скрыть $("#shop-subcategories-menu"), когда на входе #filter есть что-то (текст), и вернуть его видимость, когда он пуст. Я не могу понять, почему console.info(true) срабатывает и возвращает true, но $("#shop-subcategories-menu").toggle(true); не горит.

Если я напишу $("#shop-subcategories-menu").toggle(true); прямо в консоли, div снова станет видимым.

Я, очевидно, что-то упускаю, но я не вижу, что, пожалуйста, помогите.

Короче говоря: как сделать видимым переключатель <div id = "shop-subcategories-menu">TEST</div>, когда <input id = "filter" type = "text" placeholder = "Search.."> пуст??

$(document).ready(function(){
 $(document).on('keyup', '#filter', function (e) {
            if ($(this).val() === '') {
                console.info(true);
                $("#shop-subcategories-menu").toggle(true);
            }
            var value = $(this).val().toLowerCase();
            $("#myTable tr").filter(function () {
                $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1);
                $("#shop-subcategories-menu").toggle(false);
            });
        });
});
<!DOCTYPE html>
<html>
<head>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<style>
table {
  font-family: arial, sans-serif;
  border-collapse: collapse;
  width: 100%;
}

td, th {
  border: 1px solid #dddddd;
  text-align: left;
  padding: 8px;
}

tr:nth-child(even) {
  background-color: #dddddd;
}
</style>
</head>
<body>

<div id = "shop-subcategories-menu">TEST</div>
<p>Type something in the input field to search the table for first names, last names or emails:</p>  
<input id = "filter" type = "text" placeholder = "Search..">
<br><br>

<table>
  <thead>
  <tr>
    <th>Firstname</th>
    <th>Lastname</th>
    <th>Email</th>
  </tr>
  </thead>
  <tbody id = "myTable">
  <tr>
    <td>John</td>
    <td>Doe</td>
    <td>[email protected]</td>
  </tr>
  <tr>
    <td>Mary</td>
    <td>Moe</td>
    <td>[email protected]</td>
  </tr>
  <tr>
    <td>July</td>
    <td>Dooley</td>
    <td>[email protected]</td>
  </tr>
  <tr>
    <td>Anja</td>
    <td>Ravendale</td>
    <td>[email protected]</td>
  </tr>
  </tbody>
</table>
 

</body>
</html>

Не уверен, что вы хотите $("#myTable tr").filter там - может быть $("#myTable tr").each, потому что именно так вы его используете, поэтому $("#shop-subcategories-menu").toggle(false) срабатывает для каждой строки.

freedomn-m 07.04.2019 16:04

Пожалуйста, уточните, функция из: w3schools.com/jquery/jquery_filters.asp

Victordb 07.04.2019 16:05

Да, то, как они его использовали, это ерунда. Извините, но w3schools не лучшее место для изучения jquery. Они также использовали его как each. Его следует использовать для фильтрации результатов, а затем применить действие к отфильтрованным результатам, например $("tr").filter(function() { return $(this).text() == "x"; }).show();

freedomn-m 07.04.2019 16:07

В любом случае, $("#shop-subcategories-menu").toggle(false) по-прежнему запускается для каждой итерации. Вы пытаетесь предотвратить скрытие меню, если есть совпадающие строки?

freedomn-m 07.04.2019 16:08

Я хочу, чтобы меню было скрыто, когда на вводе есть какой-либо текст, и было видно, когда ввод пуст. Не могли бы вы опубликовать пример какого-то фрагмента кода? Я не могу понять это. В моем коде все работает, но часть ввода пуста, и меню должно снова стать видимым.

Victordb 07.04.2019 16:10
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вам не нужно вводить true, потому что toggle() делает прямо противоположное текущему состоянию элемента.

(если он показан, он скрывает его, если он скрыт, он показывает его)

или:

Просто используйте hide() и show() jQuery. https://www.w3schools.com/jquery/jquery_hide_show.asp

иметь полный контроль

обновить, чтобы ответить.

вам все равно нужно будет обрабатывать то, что происходит, когда он не пуст

в вашей функции сделайте что-то вроде:

if ($(this).val() === '') {
  console.info(true);
  $("#shop-subcategories-menu").hide();
} else {
  $("#shop-subcategories-menu").show();
}

Мой пример не работает ни с toggle() (без true), ни с show(). Не могли бы вы опубликовать пример или код?

Victordb 07.04.2019 16:09

@Victordb я отредактировал свой ответ для возможного решения

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

Разбейте это на гораздо более простой случай без таблицы и фильтрации. Таблица и фильтрация отвлекают от того, что вы спрашиваете.

Вы можете создать простое логическое значение на основе текущего значения и передать его в toggle()

$(document).ready(function() {
  $(document).on('keyup', '#filter', function(e) {
    var showMenu = !$(this).val()
    $("#shop-subcategories-menu").toggle(showMenu);

  });
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id = "shop-subcategories-menu">TEST</div>

<p>Type something in the input field to search the table for first names, last names or emails:</p>

<input id = "filter" type = "text" placeholder = "Search..">

Да, это работает, но я не могу интегрировать его с остальной частью кода. Не могли бы вы интегрировать его с фильтром таблицы?

Victordb 07.04.2019 16:30

Интегрировать для чего? Все, что вы спросили, это как обрабатывать пустое поле поиска или нет.

charlietfl 07.04.2019 16:32

Да, но в контексте фильтрации таблицы. Если вы вырвать это из контекста, это может сработать, но я не могу заставить его работать внутри всей функции. Если вы можете найти ошибку, зачем вам убирать функцию вместо того, чтобы показывать, где я ошибся?

Victordb 07.04.2019 16:33

Нет причин, по которым это не должно работать, когда таблица и фильтрация возвращаются обратно. Эти две операции не имеют ничего общего друг с другом, кроме использования одного и того же входного значения.

charlietfl 07.04.2019 16:37

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