Использование Jquery для более эффективного добавления и удаления классов на основе выбора флажка

Использование .NET MVC с представлением, имеющим таблицу с 14 столбцами. Я разрешаю пользователю открывать модальное окно и устанавливать/снимать флажки, чтобы скрыть и показать эти столбцы. Но код громоздкий и кажется неэффективным. Однако это работает, я просто ищу ответ о том, как сделать эту вещь лучше.

То, как я это сделал, я обозначил TH вот так

  <th id = "col1" class = "toggleMe1">
         UW
    </th>
    <th class = "toggleMe2">
       @Html.DisplayNameFor(model => model.Client)
     </th>

И ТАК ДАЛЬШЕ для TH и TD

<td class = "toggleMe1">
     @Html.DisplayFor(modelItem => item.NameOf)
</td>
<td class = "toggleMe2">
     @Html.DisplayFor(modelItem => item.Client)
 </td>

Вот Jquery, который я использую. Чтобы я мог изолировать эти столбцы по отдельности, не отключая/включая другие, я должен изолировать их таким образом. Класс ColorMe имеет display:none; имущество. Вот и все.

if ($("#col1Off").is(":checked")){
       $('.toggleMe1').addClass("ColorMe");
  } else {
       $('.toggleMe1').removeClass("ColorMe");
  }
  if ($("#col2Off").is(":checked")) {
        $('.toggleMe2').addClass("ColorMe");
  } else {
    $('.toggleMe2').removeClass("ColorMe");
  }

Я должен сделать это для всех 14 столбцов. Есть ли способ сократить это? Что-то более эффективное?

РЕДАКТИРОВАТЬ. ФРАГМЕНТ КОДА.

Модальное окно для установки флажков. Посмотрите в div class="Modal-body" и найдите их. Сейчас только два

<!-- Button trigger modal -->
        <button type = "button" class = "btn btn-primary" data-toggle = "modal" data-target = "#exampleModal">
            Launch demo modal
        </button>

        <!-- Modal -->
        <div class = "modal fade" id = "exampleModal" tabindex = "-1" role = "dialog" aria-labelledby = "exampleModalLabel" aria-hidden = "true">
            <div class = "modal-dialog" role = "document">
                <div class = "modal-content">
                    <div class = "modal-header">
                        <h5 class = "modal-title" id = "exampleModalLabel">Modal title</h5>
                        <button type = "button" class = "close" data-dismiss = "modal" aria-label = "Close">
                            <span aria-hidden = "true">&times;</span>
                        </button>
                    </div>
                    <div class = "modal-body">
                        <input type = "checkbox" id = "col1Off"  data-chclass = "toggleMe1" />
                        <label for = "col1">Uw</label>
                        <input type = "checkbox" id = "col2Off"  data-chclass = "toggleMe2" />
                        <label for = "col2">Client</label>
                    </div>
                    <div class = "modal-footer">
                        <button type = "button" class = "btn btn-secondary" data-dismiss = "modal">Close</button>
                        <button type = "button" class = "btn btn-primary">Save changes</button>
                    </div>
                </div>
            </div>
        </div>

КОД, чтобы открыть MODAL и код для переключения классов для скрытия/отображения.

$('#exampleModal').on('hide.bs.modal', function (e) {
    var button = $(event.relatedTarget) // Button that triggered the modal
    var recipient = button.data('whatever') // Extract info from data-* attributes

    $('input[type=checkbox]').change(function () {
        var el = $(this).data('chclass');
        $('.' + el).toggleClass("ColorMe");
    });


    // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).
    // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.
    var modal = $(this)
    modal.find('.modal-title').text('Hide or Unhide Columns')
    modal.find('.modal-body input').val(recipient)
})

Многое, наверное, не нужно. Я просто тестировал модальное окно и скопировал пример кода для тестирования.

Мне нужно открыть его дважды, чтобы класс переключения работал

вы можете использовать функцию jquery toggleClass("ColorMe"), это позволяет упростить код api.jquery.com/toggleclass

Jordi Jordi 01.03.2019 17:02

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

Andrei 01.03.2019 17:03

да. Меня волнует только видимость. Тем не менее, я попробовал класс переключения, и я не вижу, как изолировать их по отдельности, как это. Это относится ко всем или ни к одному. Любые примеры, которые вы хотите показать?

swapmeet_Lou 01.03.2019 17:05
Поведение ключевого слова "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
3
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Редактировать: Вам нужно иметь событие изменения ввода внутри $(document).ready(), чтобы оно инициализировалось, как только DOM будет готов. В настоящее время прослушиватель изменений добавлен в модальное событие hide.bs.modal. См. код ниже.

$(function() {
  $('input[type=checkbox]').change(function() {
    var el = $(this).data('chclass');
    $('.' + el).toggleClass("ColorMe");
  });
})

$('#exampleModal').on('hide.bs.modal', function(e) {
  var button = $(event.relatedTarget) // Button that triggered the modal
  var recipient = button.data('whatever') // Extract info from data-* attributes
  // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).
  // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.
  var modal = $(this)
  modal.find('.modal-title').text('Hide or Unhide Columns')
  modal.find('.modal-body input').val(recipient)
})
<link href = "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel = "stylesheet" />

<!-- Button trigger modal -->
<button type = "button" class = "btn btn-primary" data-toggle = "modal" data-target = "#exampleModal">
            Launch demo modal
        </button>

<!-- Modal -->
<div class = "modal fade" id = "exampleModal" tabindex = "-1" role = "dialog" aria-labelledby = "exampleModalLabel" aria-hidden = "true">
  <div class = "modal-dialog" role = "document">
    <div class = "modal-content">
      <div class = "modal-header">
        <h5 class = "modal-title" id = "exampleModalLabel">Modal title</h5>
        <button type = "button" class = "close" data-dismiss = "modal" aria-label = "Close">
                            <span aria-hidden = "true">&times;</span>
                        </button>
      </div>
      <div class = "modal-body">
        <input type = "checkbox" id = "col1Off" data-chclass = "toggleMe1" />
        <label for = "col1">Uw</label>
        <input type = "checkbox" id = "col2Off" data-chclass = "toggleMe2" />
        <label for = "col2">Client</label>
      </div>
      <div class = "modal-footer">
        <button type = "button" class = "btn btn-secondary" data-dismiss = "modal">Close</button>
        <button type = "button" class = "btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src = "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

Добавьте атрибут данных, например. data-chclass к каждому флажку, содержащему классы тегов <th>.

Например: <input type = "checkbox" data-chclass = "toggleMe1" />

Затем вы можете использовать:

$('input[type=checkbox]').change(function() {
    var el = $(this).data('chclass');
    $('.' + el).toggleClass("ColorMe");     
});

Спасибо. Две вещи. Во-первых, это работает. Так что спасибо тебе. Я должен сделать каждый класс уникальным в th и tds, чтобы изолировать их, но это значительно делает Jquery более эффективным. ВТОРОЕ: у меня есть модальное окно, которое содержит эти флажки. Мне нужно открыть его дважды, чтобы Jquery работал. В первый раз, когда я открываю его и ставлю/снимаю галочки, ничего не происходит. Со второго раза работает как надо. Есть идеи, почему?

swapmeet_Lou 01.03.2019 17:23

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

Anurag Srivastava 01.03.2019 17:25

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

swapmeet_Lou 01.03.2019 17:30

Это опубликовано. Надеюсь, что это дает больше информации

swapmeet_Lou 01.03.2019 17:37

Отредактировал мой ответ

Anurag Srivastava 01.03.2019 17:50

Я нашел свою проблему. Ваше редактирование, вероятно, тоже верно, но я не пробовал так, у меня была другая проблема, и как только я ее исправил, она была решена. У меня был дублированный модальный код Jquery.

swapmeet_Lou 01.03.2019 17:51

Давайте продолжить обсуждение в чате.

Anurag Srivastava 01.03.2019 17:52

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